Cell高度的自适应

前言


Auto sizing cell -estimatedRowHeight属性

iOS8之后,UITableView新增加了estimatedRowHeight属性,这样,我们可以用它来实现UITableViewCell的自动布局。就不用去计算每个cell上Label的高度再去约定cell的高度,甚至可以不用去实现heightForRowAtIndexPath的代理方法。


简单使用

先新建UITableViewCell

然后我们先添加上约束。这里我直接在storyboard上拉的,并关联Cell以便以自定的属性赋值。

需要注意的是:

1.label的高度不要约束定死,但是它离上下左右的距离要定好,label下面可以还有上些其他的控件要加在上面。

2.UITableViewCell的size inspector里面 Row Height 是Default而不是custom的数值。

3.label的的行数一定要设置为0,不然没有换行,系统不知道怎么去自动计算label的高度来进行调整。

设置estimatedRowHeight值

1.直接设值

self.tableView.estimatedRowHeight = 60;

2.或者分别给个大概值

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 60;
}

完成后就可以看到效果了。

示例代码


注意事项

estimatedRowHeight是否可以随便设值?

虽然系统会自动帮我们调整cell的高度,而estimatedRowHeight的初始默认高度似乎没用,其实不然,estimatedRowHeight越接近cell的最终高度越好,因为cell的调整高度重绘cell会浪费程序的运行,就会相应的耗费资源。

因此可能会产生一些坑,比如设置初始值差距较大时,在调用scrollToRowAtIndexPath:滚动到最底部的方法时。就有可能出现此方法运行完了,cell的高度还没有调整完,导致视图显示不是最底部的小BUG.

参考

避免的方法

1.用dispatch_after一个很短的时间再去scrollToRowAtIndexPath。

2.设定estimatedRowHeight尽量接近最终的高度。
可以在

 - (CGFloat)tableView:(UITableView *)tableView   estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;//相对的计算一下高度。

}