最近翻出了之前的老项目,想做一下iphoneX适配,碰巧发现了一个关于iOS 11的坑,简单描述一下:
- 在一个继承UITableViewController的VC中,我在以下的代理方法里面给一个属性赋了值
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
- 接着在下述的数据源方法中用到了该属性的值
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- 但是效果并不是理想的,经过断点发现,先调用了
cellForRowAtIndexPath
的方法,然后才走到heightForRowAtIndexPath
,这跟之前的版本有较大差别(内心OS:mmp哪有先设置内容再设置高度的)
有了上述不靠谱的经验,我又在简书发现一篇相关博文,讲到了iOS10之前的版本中,这两个方法顺序也是不一致的
结论:
-
iOS7.1
中先依次调一遍heightForRow方法再依次调一遍cellForRow
方法,在调cellForRow
方法的时候并不会再调一次对应的heightForRow方法。
-
iOS8
中先依次调heightForRow
(如果行数超过屏幕依次调用两次,如果行数很少,没有超过屏幕,只依次调用一次),之后每调一次cellForRow
的时候又调一次对应的heightForRow
方法。
iOS9
和iOS10
中,heightForRow
方法会先调用三次,然后每调用一次cellForRow
的时候再调用一次对应的heightForRow
。
(以上低版本结论转载自Code_Ninja的博文,在低版本上的逻辑,都是heightForRow
的实现在cellForRow
之前,但在iOS11
上就不一样了)
-
iOS11
中,先调用heightForRow
,再调用cellForRow