相信大家都已经升级了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

关于iOS11中estimatedRowHeight属性相关推荐

  1. python私有属性怎么定义_Python中私有属性的定义方式

    Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...

  2. php js怎么去掉类属性,如何修改DOM中的属性,类和样式

    通过jQuery来获取要修改的DOM元素,然后通过JavaScript中方法来对属性.类以及样式进行修改 今天在本篇文章中将分享的是如何通过修改html元素节点的样式,类和属性来进一步的更改dom,, ...

  3. junit集成Hamcrest测试集合中某个属性是否包含特定值

    junit已经集成Hamcrest但是还是需要引用hamcrest-library,不然只有基本方法,高级的没有 <dependency> <groupId>junit< ...

  4. CSS中background-position属性

    CSS中background属性是经常用到的,可以给某个块设置背景色.以下主要说明以下background-position属性的应用. 一般在设置background属性时的写法是: backgro ...

  5. SpringMVC js如何获取后台model中的属性值

    SpringMVC js如何获取后台model中的属性值 companylist 如何获取 var companylist="${companylist}"; 希望对你有所帮助 个 ...

  6. python类中的属性分为类属性和实例属性两种_python中类和实例如何绑定属性与方法示例详解...

    前言 python类与实例的方法的调用中觉得云里雾里,思考之后将自己的想法记录下,一来加深自己理解,巩固自己记忆,而来帮助一些想要学习python的朋友理解这门抽象的语言,由于Python是动态语言, ...

  7. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  8. JS基础 -- 枚举对象中的属性

    /** 什么事枚举对象中的属性?* 下面以一个例子来慢慢解释*///创建一个对象var obj = {name: '唐一彩',age: 4000,gender: '男',address: '白马寺'} ...

  9. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一 本方案的例子请见源代码打包文件中的Property1部分 在对 ...

最新文章

  1. 2022-2028年中国微藻行业市场调查研究及前瞻分析报告
  2. 计算机内存不足提示栻框,【计算机】计算机文化基础.ppt
  3. Python Django开发案例:GET方式实现登录功能
  4. Apache详细介绍 - [ Apache v2.4.10 for Windows ]
  5. scrapyd部署_第八章 第一节 scrapyd和scrapy-client
  6. linux db2sysc 内存,db2sysc进程占用linux内存持续增长,请各位指点。
  7. android时间戳字体,Android获取当前时间戳?
  8. Docker Compose如何与SkyEye完美结合
  9. English course (6)
  10. linux怎么安装网卡驱动固件,Linux网卡驱动的安装方式
  11. thinkphp学习总结
  12. 漫游流量 android,人在国外 怎么设置小米手机国际漫游指定app使用流量?
  13. 想知道raw转换jpg软件怎么用?教你raw转换的方法
  14. ImageJ自动细胞计数的方法以及批量处理多张图片
  15. 天猫精灵对接智能设备
  16. 深入原理64式:46 高中数学公式总结
  17. node.js里的天龙八部
  18. TextMeshPro中文字体生成和字体材质更换
  19. Oracle数据库之coalesce函数的用法
  20. Html5笔记之第一天

热门文章

  1. 2020哔哩哔哩bilibili安全挑战赛前5题思路
  2. python学习之 爬取煎蛋网美女图
  3. 追女生攻略:吸引女生的几个技巧点是什么?
  4. linux怎么创建python文件_Linux下创建python脚本并运行(入门)
  5. LVS三种工作模式原理
  6. 华为十年测试老鸟教您如何写高质量的自动化测试工程师简历--看完必有所获
  7. 全球大数据工具汇总简介
  8. 来自python的彩蛋——python之禅
  9. 故宫------珍宝馆
  10. 智能未来趋势,中电丽声Celisen光传感器:让行动装置由被动变主动