博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于iOS11中estimatedRowHeight属性
阅读量:6903 次
发布时间:2019-06-27

本文共 2353 字,大约阅读时间需要 7 分钟。

相信大家都已经升级了iOS11,而且也做了相应的适配,其中对于tableView这个控件进行适配的时候,比如:集成MJRefresh的时候,当然还有其他很多情况下,很多资料都有说需要把estimatedRowHeight属性设置为0,那么它到底是什么,为什么要这么来做,我们来探究下。

什么是estimatedRowHeight?

简而言之estimatedRowHeight是一个预估高度,iOS11之前是为0,在iOS11下,这个值默认为44。

我们知道tableView是继承于ScrollView的,一个scrollView能滑动,需要设置contentSize,那么tableView的contentSize怎么来呢?iOS11之前,会调用tableView每一个cell的heightForRowAtIndexPath来算出整个高度,从而相加得出contentSize来,这一个步骤挺耗性能!

所以iOS11,默认打开了estimatedRowHeight估算高度功能,当tableView创建完成后,contentSize为estimatedRowHeight(默认值为44)*cell的数量,不需要遍历每一个cell的heightForRowAtIndexPath来计算了。但是这样子真实的contentSize又怎么得出来呢?

不要急,我们看官方文档的描述,里面的一句话

也就是说在滑动的时候,来计算这个值。具体是怎么计算的,我们可以举2个例子:

例子一

我们创建一个TableView,在iPhone7(iOS11)下,origin = (x = 0, y = 20),size = (width = 375, height = 657),此时方法返回的cell高度为50

-(NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section{

return 100; }

-(CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath{

return 50; }

-(void)scrollViewDidScroll:(UIScrollView )scrollView {

NSLog(@”table ContentSize %@”, NSStringFromCGSize(scrollView.contentSize)); }

结果我们可以看到下图,初始高度为100 * 44=4400

table ContentSize {375, 4400}

当我往下拉(往下不是往上),不会出现新的cell,仅仅是为了触发scrollViewDidScroll这个方法来打印出下面语句来

table ContentSize {375, 4490}

这个值怎么出来的呢?按照计算的话,也应该是4400+(50-44)13=4478 (这里50-44是每一行的实际高度和预估的高度的差值;13是界面显示出0~12,总共13行)。 后面经过调试你会发现,实际上会调用15次heightForRow的方法,这15次,是预估高度为44,在657高度的屏幕上,会显示出657/44=15个cell出来,所以它的实际计算会根据这个值来进行,那么此时我们就能得出正确的结论来了4400+15(50-44)=4490。

后面当你每次显示出新的cell出来的时候,再进行调整,增加50-44=6的高度。

例子二

和例子一的区别在于,cell高度返回为30,也就是小于预估高度44,其余不变

-(CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath{

return 30; }

结果我们可以看到下图,初始高度为100 * 44=4400

table ContentSize {375, 4400}

当我往下拉(往下不是往上),不会出现新的cell,仅仅是为了触发scrollViewDidScroll这个方法来打印出下面语句来

table ContentSize {375, 4092}

按照例子一的解释,我们计算下:4400 -(44-30)15= 4190 !!它又是怎么来的呢?经过调试,我们发现它调用了heightForRow这个方法22次,也就是目前显示在屏幕上的可见cell数量,按照这个,确实符合:4400 -(44-30)22= 4092。同样的,当你往上滑动,出现新的cell的时候,contentSize的高度会减去(44-30)

总结

那么我们可以得出结论,当你的实际高度大于预估高度的时候,会按照预估高度下的cell的数量来计算contentSize,当实际高度小于预估高度的时候,会按照实际高度下的cell的数量来计算contentSize。

如果我们要回到iOS11之前的效果,我们可以让estimatedRowHeight=0,关闭这个预估高度的效果。

延展

为什么使用MJRefresh在iOS11下要让estimatedRowHeight=0,因为MJRefresh底部的上拉刷新是根据contentSize来计算的,当数据更新的时候,得出来的contentSize只是预估的。

欢迎加群讨论(请备注来源):272306631

转载于:https://juejin.im/post/5a4f19e7f265da3e261bc3ea

你可能感兴趣的文章
HTML5 移动端的上下左右滑动问题
查看>>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
Visual Studio示例代码浏览器
查看>>
MySQL中多表删除方法(转载)
查看>>
[Javascript] Fetch API
查看>>
[改善Java代码]不使用stop方法停止线程
查看>>
Spring Boot新模块devtools
查看>>
关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结
查看>>
HAProxy的三种不同类型配置方案
查看>>
Unity3d之截图
查看>>
Windows下的Jdk 1.7*安装并配置(图文详解)
查看>>
JS判断客户端是手机还是PC的2个代码(转)
查看>>
分布式服务框架设计和实现
查看>>
dispatchTouchEvent
查看>>
Zabbix-3.0.3实现微信(WeChat)告警
查看>>
ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区...
查看>>
解决客户端访问https报错
查看>>
PHPCMS列表循环序列号自增标签代码
查看>>
2016年第15本:微信营销与运营----策略、方法、技巧与实践
查看>>
HTML之Data URL(转)
查看>>