相信大家都已经升级了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. Javascript学习笔记2——函数
  2. Angular7教程-06-页面与数据交互
  3. python sklearn.neural_network.MLPClassifier() 神经网络改变模型复杂度的四种方法
  4. 接地脚是什么意思_帮个忙老铁们 急急急!!!什么叫相地接错并缺地。?_天涯问答_天涯社区...
  5. SQL中binary 和 varbinary的区别
  6. AngularJS控制器和过滤器学习(三)
  7. 关于小范围整数N拆解成2的幂相加的个数
  8. linux 删除中文文件夹,Linux删除文件夹命令是什么
  9. 纯python好找工作吗_python现在还好找工作吗?
  10. Ms sql pivot unpivot
  11. kafka下载与安装教程
  12. 如何取消html中页眉的下划线,怎么取消页眉页脚的横线_怎样取消页眉上的横线-win7之家...
  13. 响应式布局——媒体查询
  14. 考高级用计算机和外语证,济南:“老外”也能评职称了!2018年度申报开始,这些专业评高级不用考外语计算机...
  15. NOI.6.08石头剪刀布
  16. 西北农林科技大学接口技术设计性实验一——8255并行接口实验
  17. 树形数据结构和扁平数据相互转换
  18. 【mongodb】比较符及修改器
  19. centos7一键优化脚本
  20. 美化QTabWidget

热门文章

  1. Spring 生命周期回调机制
  2. 服务器操作系统型号,服务器操作系统型号怎么表示
  3. 需要外语翻译怎么办?用好语音翻译器就够了
  4. 【故障诊断】基于PSO_VMD_MCKD方法的风机轴承微弱故障诊断
  5. Unity 移动端禁止多点触摸,禁止多点操作
  6. 音质好的蓝牙耳机有哪些?音质最好的蓝牙耳机排行
  7. mui android交互,一加手机CMUI交互界面曝光 扁平化小清新
  8. 一个共通的viewModel搞定所有的编辑页面
  9. 高德地图画带箭头的线_现代汽车把艺术展览搬到线上,邀您逛全景获奖展
  10. 【English学习】一个单词组成的句子,简单又内涵!