本文章主要介绍iOS8之后苹果推出的一个新特性Self Sizing Cells,意思就是让cell自己计算自己的高度,当我们在cell里面添加完所需控件,并约束好位置之后只要调用这两句代码就可以实现cell高度的自适应。
_tableView.estimatedRowHeight = 44.f; //推测高度,必须有,可以随便写多少
_tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默认就是这个值,可以省略
这两句代码之后,即可放心的往cell的控件里面加上内容,cell会根据内部所有控件的高度动态的计算自己的高度从而显示出来。这个会根据自己内部的内容调整自己的大小。这就给iOS开发者提供了很大的便利,不再需要之前复杂的自适应计算方法。
现在我们来看看estimatedRowHeight
是什么?
关键点1:必须要做好控件之间的约束!!
现在自定义的cell中高度随着内容动态改变的label,这里有个注意点就是label和cell边界的距离要确定好,就是label的左右间距必须要确定好、距离其他控件的距离要确定好、不能固定死label的高度,然后设置label的numberOfLines=0,行数设置为0即意味着label可以有任意行。
关键点2:必须要实现estimatedRowHeight的方法或属性
如果不重写此方法,仅重写heightForRowAtIndexPath,那么大家会发现,cell并不会根据label的内容,自适应高度。
原因:系统是先获取cell的高度,再获取cell的view。也就是先调用heightForRowAtIndexPath,再调用cellForRowAtIndexPath。在cellForRowAtIndexPath被调用之前,你的label是没有被设置文本内容的,因此它获取到的高度,并不是你想要的。那么我们必须想办法让系统在获取了cell之后,再获取cell的高度
解决方案:重写estimatedHeightForRowAtIndexPath,顾名思义,它会返回一个估计高度,有了这个方法后,tableview会先调用它获取估计高度,然后获取cell,最后获取真实高度。estimatedHeightForRowAtIndexPath的返回值可以随意,返回多少都可以,只是给tableview一个安慰而已,让它延迟获取真实的高度。
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44.f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
或者直接调用
_tableView.estimatedRowHeight = 44.f; //推测高度,必须有,可以随便写多少
_tableView.rowHeight =UITableViewAutomaticDimension;//iOS8之后默认就是这个值,可以省略