背景:这几天做项目,又遇到了cell的自适应高度问题
首先我们必须要知道UITableViewcell 的代理执行顺序,在iOS7出现了一个代理方法叫:tableView: estimatedHeightForRowAtIndexPath:,首先我们要知道在使用UITableViewcell的时候必须计算cell的高度,那如果cell的内容是动态的呢?这个时候我们就必须动态的返回高度了,这就回到了我们项目中遇到的问题。知道了这一点,接下来我们就必须知道UITableViewde 的代理方法的执行顺序,分别如下图:
可以看到在执行cellForRowAtIndexPath之前是会先执行heightForRowAtIndexPath的,也就是说有可能cell不存在的时候就调用了heightForRowAtIndexPath,这样是无法满足项目要求的,直到iOS7出现的新的API,这就是上面讲的:tableView: estimatedHeightForRowAtIndexPath:,这个代理方法回给cell的一个预估高度,如果实现了这个方法,也就意味着UITableView的代理方法的执行顺序的改变,如下图:
稍微整理一下就会得到如下结论:
- 首先tableView会先向代理拿得到每个cell的预估高度(estimatedHeightForRow...方法),并且拿这个高度去计算整个tableView应该显示的范围
- 根据每行预估的高度,算出一屏显示的cell的个数,并先对这些cell(调用cellForRow...方法)进行绘制
- 在绘制时拿到cell的真实高度,然后放在heightForRow...方法里面拿给tabelView去用
- 屏幕滚动(有cell进入屏幕)的时候,仍然会调用绘制以及获取真实高度的方法.
简单点说,就是预估高度用来让tableView心里有个底,把cell先绘制出来,但最后实际的cell高度还是会从heightForRow...方法中获取.
参考文献:
文/CoderAO(简书作者)
原文链接:http://www.jianshu.com/p/6ab92579fcf1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
时间: 2024-10-19 22:39:48