estimatedRowHeight 与 self sizing cells

2023-05-16

estimatedRowHeight

为什么要引入estimatedRowHeight呢?顾名思义就是预估高度。在预估高度之前,与高度相关的属性及方法比较常用的有以下两个:
* rowHeight:这个属性适合用于拥有固定高度的tableview,这种方式比较高效,滚动时没有任何高度计算,可以得到较好的滚动体验。
* tableview:heightForRowAtIndexPath:这种方式适用于tableview需要根据不同的内容展示不同高度的cell,在该方法中计算得出cell高度。但是这种方式的缺点也很明显,即使你有20,000行的cell,系统也会在tableview加载的时候提前获取所有cell的高度。延长了tableview的加载时间。

文档中对estimatedRowHeight的解释是这样的:提供一个非负的预估行高可以提高tableview的加载速度。如果一个tableview中包含可变的行高,当tableview加载数据时,会去计算所有的行高,这个代价是很大的。使用预估高度的话,你就可以将一些计算工作从加载时间推迟到滚动时间。

我们都知道,创建一个UIScrollView,需要设置它的contentSize,才可以正确的显示,tableview也一样,tableview在创建了之后,需要知道即将展示在tableview中展示的数据个数以及每条数据内容决定的cell的高度,这样才能计算得到其contentSize,得到contentSize之后,才能正确得显示。因此,如果你实现了tableview:heightForRowAtIndexPath:的代理方法,tableview会在加载阶段调用所有的cell对应的该方法(设置不止一次地调用),去计算contentSize。如果你在高度计算的代理方法中进行了很复杂的计算,那么你很可能会在页面出现好久,才看到的tableview显示。因此,预估高度的出现,使得加载时不需要去计算所有cell对应的真实高度,而是使用预估高度计算得出一个预估的contentSize,在你滚动tableview的时候,随着cell不断滚入屏幕,cell的高度也被计算出来,这个时候tableview.contentSize再根据不断计算得出的cell的真实高度来进行调整。这么做的高处是,你不需要等好久才看到tableview展示出来了。但是缺点也很明显,你本可以在加载时候将所有cell的高度计算并缓存,这样滚动时就不需要再进行计算,直接取得缓存高度酒可以,但是预估高度的存在,使得在滚动时才会去计算cell高度,滚动体验会受到影响。这个时候,还是不要开启预估高度的好。另外,tableview在不断调整自己的contentSize的过程中,右侧的indicator会出现突然变化或者跳跃的现象。

下面一组数据反应了iOS不同系统版本中关于预估高度作出的改变:(见ppt中的数据)

由此得出下面几个结论:
* 不使用预估高度时初始计算高度计算次数很高,远大于数据的数量
* 使用预估高度之后初始高度计算次数大大减小,优化了tableview加载的时间
* 除了iOS7之外,8-9在继续滚动时依旧会计算cell高度

iOS8中苹果推荐使用动态字体,也就是用于可以在设置中调整字体大小,这样一来,你的cell即使已经加载了数据,高度也是会发生变化的,因此在iOS8之后,即使tableviewcell高度已经计算过,只要你不停滚动,计算也不会停止。

self-sizing cells

假设我们正在滚动一个tableview,此时第四行cell即将出现在屏幕上,在这个cell被创建之前,我们所知道的只有它的预估高度,继续滚动,当cell即将出现在屏幕上时,被创建出来,然后系统会去问cell要它的size,如果这个size不同于之前的estimatedRowHeight的值,系统会对tableview.contentSize进行调整,调整之后,cell就会出现在屏幕上了。

因此,self-sizing也就是说让cell自己负责计算自己的高度,那么cell如何决定自己的高度呢?有以下三种方法:

  • Auto Layout
  • Override sizeThatFits()
  • Override preferredLayoutAttributesFittingAttributes()
    值得注意的是,对cell设置约束时,需要把cell的宽高都指定好。如果你的tableview是通过nib或者storyboard创建的,cell会有一个默认高度,这个时候一定不要忘了下面这行代码:
tableview.rowHeight = UITableViewAutomaticDimension;

这也就意味着高度tableview,我没有行高,你需要根据其他的信息得出行高。

UICollectionViewFlowLayoutAutomatic

这是iOS10中为estimatedItemSize新增的一个值。iOS10以前,你会设置你的estimatedItemSize为一个具体的预估大小,在你滚动UICollectionView的过程中,这个预估大小一直被用于未创建的cell,没有变化。在iOS10中,如果你设置了

layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize;

UICollectionView在为你计算cell的预估大小,并且,随着cell不断被加载出来,这个预估大小也会不断调增,逐渐调整为一个最为接近的值,这就为我们解决了有时候不知道设置一个怎样的预估大小的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

estimatedRowHeight 与 self sizing cells 的相关文章

  • css流体布局下发宽度分离原则与box-sizing的使用

    学习完了CSS世界的总结 因为默认的box sizing 为content box宽度作用在内容 所以当出现 box width 100px border 1px solid red 或 box width 100px padding 20
  • python学习-def __init__(self)理解(1)

    python中 init 的作用 在python中创建类后 xff0c 通常会创建一个 init 方法 xff0c 这个方法会在创建类的实例的时候自动执行 实例1 实例化Bob这个对象的时候 xff0c init 方法会自动执行 xff1a
  • python:这种错误的原因和解决方法 "NameError:name 'self' is not defined?"

    class A def init self a self a 61 a def p self b 61 self a print b 在学习的时候 xff0c 写了以上代码 xff0c 报了如下的错误 NameError name 39 s
  • 程序员常用快捷键整理(VS、Windows,提高效率,只有一步之遥)

    前言 本篇博客整理了程序员常用的快捷键 主要包括VS visual studio 编译器的快捷键 Windows操作系统快捷键 由于我目前只是一个刚学了C的程序员小白 对于其他的编译环境的相关快捷键等之后学到后会继续补充在这篇博客 提高编程
  • 为什么我不能改变自我价值?

    为什么我可以这样改变 自我 self map x x 2 或者这样 self replace self map x x 2 但不是这样 self self map x x 2 为什么 Ruby 不允许我更改 self 变量指向的对象 但允许
  • 在 Swift 中声明自引用指针[重复]

    这个问题在这里已经有答案了 这段 Obj C 代码在 swift 中的等价物是什么 我猜测 CMutableVoidPointer 的一些事情 static void CapturingStillImageContext Capturing
  • Python、__init__ 和自我困惑

    好吧 当我发现这个时 我正在查看一些来源 gt gt gt def parse self filename parse ID3v1 0 tags from MP3 file self clear try fsock open filenam
  • 何时在 Ruby 方法中使用 `self.foo` 而不是 `foo`

    这不是 Rails 特有的 我只是使用 Rails 作为示例 我在 Rails 中有一个模型 class Item lt ActiveRecord Base def hello puts Hello self name end end 我们
  • 阿帕奇 POI 和颜色

    我在使用 Apache POI 时遇到一些问题 如果能得到一些帮助就好了 我想删除 Excel 工作表子部分中的颜色 为此 我尝试的第一件事是渲染我想要清理的单元格 假设仅第一行的单元格 并将其颜色设置为白色 cell getCellSty
  • Firefox 浏览器无法识别 table.cells 吗?

    我有以下 JavaScript 代码 var myCellCollection document getElementById myTbl cells 这在 IE 中效果很好 它返回表格单元格的集合 但同一行在 Firefox 中返回 未定
  • 自签名小程序可以访问本地文件系统吗

    您好 我已经创建了一个自签名小程序 但无法访问本地文件系统 我该怎么办 你需要将你的IO代码包装在里面特权动作 通常 您需要使用测试证书对小程序进行签名 用户将看到警告 并且在加载小程序时必须接受证书 那么您需要将代码包装在 Privili
  • 将 self 参数命名为其他名称

    在 Python 中 以下代码是有效的 class A def init me me foo 17 def print foo myself print myself foo def set foo i v i foo v 正如您可能已经注
  • 如何使用Ruby的self关键字

    据我了解self 它指的是该类的当前实例 无论如何 这不是始终的默认行为吗 例如 不是 self var one method args 相当于 var one method args 如果是的话有什么用self 有几个重要的用途 其中大部
  • 如何跟踪类实例?

    在程序结束时 我希望将类的所有实例中的特定变量加载到字典中 例如 class Foo def init self self x foo1 Foo foo2 Foo 假设实例的数量会有所不同 我希望将 Foo 每个实例的 x 字典加载到一个新
  • 在 Go 中,将接收者变量命名为“self”是误导还是好的做法?

    我看过相当多的关于 Go 的博客和视频 据我记得 没有一个作者在编写方法时使用 self 或 this 作为接收者变量 然而 似乎有很多关于堆栈溢出的问题可以做到这一点 这让我思考这是否会误导将变量命名为 self 阅读规格方法集 http
  • appdelegate 中的 clickedButtonAtIndex 未调用

    我在我的应用程序 AppDelegate m 文件中使用 2 个按钮 取消 和 确定 调用 UIAlert 但在点击 取消 或 确定 按钮时会调用警报 void alertView UIAlertView alertView clicked
  • 如何从Python中的self方法获取self对象名称

    我正在尝试找到一种方法来自动打印对象引用名称print object更具体 假设我有一堂课 class A def init self self cards def str self return a string representati
  • 如何在类的范围内访问“self”?

    我遇到了一个有趣的问题 假设我们有一个类 在它的构造函数中我们采用一个布尔值作为参数 如何根据实例的条件 布尔值在类内定义方法 例如 class X def init self x self x x if self x true self
  • python 课堂上有太多自我

    我正在学习 Python OOP 并尝试将 Java 类转换为 Python 类 请参阅此 PDF 中的第 15 页了解 Java 代码 google 文档link https docs google com open id 1eqzajO
  • 如何仅通过鼠标使用 javafx 在表格视图中选择多个单元格?

    我有一个在 javafx 中带有表格视图的应用程序 我想仅通过鼠标选择多个单元格 类似于 Excel 中存在的选择 我尝试过 但我不能做某事 这个问题的正确答案在这里https community oracle com thread 262

随机推荐

  • 在rviz中出现For frame [laser]: Fixed Frame [laser_link] does not exist

    参考 xff1a 链接 一 激光雷达在rviz中没有显示扫描数据 二 解决方法 topic报frame transform之类错误 xff0c 就有两个办法 xff1a 1 把global fixed frame设成topic自己所在的坐标
  • ubuntu安装nerd font字体

    步骤 1 下载nerd font字体文件到某个文件夹 在网址https www nerdfonts com font downloads xff0c 找到JetBrainsMono xff0c DroidSansMono xff0c Dej
  • OpenStack计费项目CloudKitty的强化及运用

    本文转自Openstack中国社区Openstack计费项目CloudKitty的强化及运用 本文作者 xff1a Li Xiangjun 在OpenStack开发社区向 Big Tent 模式全面转型之际 xff0c 一个新的项目 Clo
  • Winpcap数据包的抓取及还原

    winpcap技术手册 xff0c 除了安装文件里doc文件下有个帮助 xff0c 这里在给一个 xff1a http www ferrisxu com WinPcap html index html 这里我们用pcap next ex 函
  • 柱面坐标变换

    在图像拍摄点固定的情况下 xff0c 对图像做柱面投影变换 xff0c 再进行配准会得到较为理想的效果 如图所示 xff0c 点P在相机所处的坐标系下的坐标为 xff0c 在像素坐标系下表示为P xff08 x xff0c y xff09
  • 几行Python代码教你zip打包

    码农一方面是码代码 xff0c 另一方面是布署服务 xff0c 传到服务器时 xff0c 文件数据较多时 xff0c 直接通过文件传输概率性会丢失文件 xff0c 最好是先压成zip包 xff0c 再传输 但是 xff0c zip包中的文件
  • 推荐一款强大的OCR工具

    大家好 xff0c 我是 jonssonyan xff0c 今天我想向大家介绍一款强大的 OCR 工具 Umi OCR 以下是它的开源地址 Umi OCR GitHub xff1a https github com hiroi sora U
  • ArXiv简介以及论文提交

    arXiv网站简介 arXiv是一个收集物理学 数学 计算机科学 生物学与数理经济学的论文预印本的网站 其中arXiv发音同 archive xff0c 因为 X 代表希腊字母 xff0c 国际音标为 kai 它于1991年8月14日成立
  • Vue中axios请求报错

    问题 xff1a axios请求成功但是还是进入catch 在请求后端接口后 xff0c 发现请求成功了 xff0c 但是却报错了 在经过排查之后 xff0c 发现后端返回的数据结构更改了 xff0c 所以导致成功的代码块内部出现错误 xf
  • lsnrctl command not found

    在linux安装完oracle时 当你遇到lsnrctl command not found等问题都不能用时 会有几种情况 1 首先你先查看下环境变量里面有没有加入oracle的配置 执行 echo ORACLE HOME 没有的话 你执行
  • CNC加工中心程序代码大全,你还不收藏吗?

    数控程序中字母的含义 O xff1a 程序号 xff0c 设定程序号 N xff1a 程序段号 xff0c 设定程序顺序号 G xff1a 准备功能 X Y Z xff1a 尺寸字符 xff0c 轴移动指令 A B C U V W xff1
  • 413 Request Entity Too Large(请求实体太大)

    最近开发时遇到了上传失败的情况 xff0c 提示 xff1a 413 Request Entity Too Large xff08 请求实体太大 xff09 因为上传通过代理服务器Nginx xff0c 因此可以 修改代理服务器Nginx
  • Photos(PHFetchResultChangeDetails)

    Photos PHChange Photos PHObjectChangeDetails Photos PHFetchResultChangeDetails PHFetchResultChangeDetails主要用于记录PHFetchRe
  • 远程桌面连接的时候 屏幕一闪就没了 然后不能连接上

    重启本地两个远程服务组件Remote Desktop Services和Remote Desktop Services usermode Port Redirector 如果还不行 xff0c 按下面的试试 启动注册表编辑器 Regedt3
  • 关于codeforces比赛规则介绍(转载)

    Codeforces 简称 cf 所以谈论cf的时候经常被误会成TX的那款游戏 网址 codeforces com 这是一个俄国的算法竞赛网站 由来自萨拉托夫州立大学 由Mike Mirzayanov领导的一个团队创立和维护 是一个举办比赛
  • 自制书立

    店里卖的书立简直贵的离谱 xff0c 不就是一个直角的铁片吗 xff0c 要那么多钱 索性自己做一个 xff0c 就用最便宜的衣架 xff0c 不到一元钱搞定 xff01 把衣架弯成直角 换个角度 xff0c 再来一张 完事了 xff0c
  • 连载:面向对象葵花宝典:思想、技巧与实践(27) - 动态模型设计

    类模型 指导我们如何声明类 xff0c 动态模型 指导我们如何实现类 xff01 动态模型设计一般都是在类模型设计完成后才开始 xff0c 因为动态模型设计的时候一般都需要用到类模型中的类 相对类模型来说 xff0c 动态模型要相对简单一些
  • C语言经典100题——输出“魔方阵“

    lt 1 gt 题目描述 输出 魔方阵 xff0c 所谓魔方阵是指它的每一行 每一列和对角线之和均相等 例如 xff1a 8 1 6 3 5 7 4 9 2 要求输出1 n 2的自然数构成的魔方阵 lt 2 gt 思路分析 将1放在第1行中
  • MFC中调用std::cout

    std cout很好用 xff0c 但是在MFC中 xff0c 一般的变量值输出MessageBox 来显示 xff0c 很不方便 下面就实战一下利用std cout来输出 1 利用VC 6 0 MFC App Wizard新建一个基于对话
  • estimatedRowHeight 与 self sizing cells

    estimatedRowHeight 为什么要引入estimatedRowHeight呢 xff1f 顾名思义就是预估高度 在预估高度之前 xff0c 与高度相关的属性及方法比较常用的有以下两个 xff1a rowHeight 这个属性适合