liwei's blog

tableHeaderView的autolayout

新项目开始了,准备用上强大的autolayout,说到这里感觉很惭愧,直到现在才开始用,我一直是手写代码,所以首选Masonry来写autolayout的代码。网上的教程还是挺多的,最实在的还是看Masonry中demo,里面有几种基本的布局样式,可以用来应付常见的场景了。

在写的过程中发现iOS7.1SDK下面经常会有警告而且会crash,iOS8.4SDK下则会少一些,基本上在iOS8下面由于autolayout引起crash的在7下面肯定崩,在7里面crash的8里面不一定崩,应该是苹果对autolayout一直在优化吧,感觉autolayout还是很脆弱,应该是我理解不够深,写的时候经常有MASLayoutConstraint警告,多写一些就慢慢熟悉了。

为了看一些错误,家里Xcode6还要准备上iOS7的模拟器,Xcode内置安装太卡了,时不时就超时,看来只有手动安装了教程在此,直接拉到下面的新版安装方法

  1. 先下载好文件,提取码:x5tx
  2. 进入终端获取root 权限:sudo -s
  3. 再创建这个目录:mkdir -p /Library/Developer/CoreSimulator/Profiles/Runtimes/
  4. 执行复制:cp -R {模拟器路径} /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 7.1.simruntime
  5. 创建后查看这个目录的信息,会看到权限拥有者是 【system】而不是【你的用户名】
  6. 此时还有最后一步,重启电脑,打开Xcode就可以看到iOS7.1的模拟器了

有了模拟器就开始,开工了,以前绝对布局的时候写tableHeaderView的时候只需设置他的height就可以了,x,y,width什么的不需要设置,设置也没用,应该是内部实现了(0, 0,tableview.frame.size.width, height) ,下面就是创建了一个高度100的headView

1
2
3
UIView *headView =[[UIView alloc]initWithFrame:CGRectMake(0,0,0,100)];
headView.backgroundColor = [UIColor yellowColor];
tableView.tableHeaderView = headView;

那么用了autolayout之后,设置frame就没用了,我的思路是直接设置一个高就完事了,如下

1
2
3
[headView makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(100);
}];

这样写了之后在7.1里面直接报错Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super. 在8里面没有报错,但是headView并没有显示,按照字面的意思理解就是父视图要重新布局,我觉得应该是tableHeaderView在tableview里面系统应该有自己的布局,在外面设置的话就冲突了,然后报错,也不知道这个理解是不是对的。

后来stackoverflow上面看了一些问答,基本上是先设置好headView,根据headView的Subview的autolayout计算出高度,然后再高度重新赋值给headView。下面是headView上面有2个子视图,高度各100

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
UIView *headView =[UIView new];
headView.backgroundColor = [UIColor yellowColor];

UIView *view1 =[UIView new];
view1.backgroundColor =[UIColor redColor];
[headView addSubview:view1];
[view1 makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(10);
make.right.equalTo(-10);
make.height.equalTo(100);
}];

UIView *view2 =[UIView new];
view2.backgroundColor =[UIColor blackColor];
[headView addSubview:view2];
[view2 makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(view1.bottom).offset(10);
make.left.right.equalTo(view1);
make.height.equalTo(100);
make.bottom.equalTo(headView).offset(-10);
}];

CGFloat height = [headView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
CGRect frame = headView.frame;
frame.size.height = height;
headView.frame =frame;
tableView.tableHeaderView = headView;

demo在此,autolayout还需多用才能慢慢体会它的强大之处,用多了理解就深了,加油吧。