UITableView+FDTemplateLayoutCell源码学习笔记

摘要:
Tid=299773基本原理是,通过缓存每个单元格的高度,该单元格也将从不可见区域调用一次。Sunny缓存每个单元格的计算高度。下次获取同一位置的单元格高度时,当表视图未处于滚动状态时,将异步计算尚未计算的单元格的高度,然后异步执行预缓存的行高度计算。如果缓存了更改行的高度,请返回行高度。如果没有缓存。
本文转载至  http://www.cocoachina.com/bbs/read.php?tid=299773基本原理是通过缓存每个cell的高度,当tableview回调delegate的heightForRowAtIndexPath的时候,省去了计算cell高度计算,极大的提高了tableview的滑动体验。

因为 heightForRowAtIndexPath这个接口会在reloadData的时候,每个cell都会调用一次,同时滚动tableview的时候,cell从不可见到可见区域也会被调用一次heightForRowAtIndexPath,所以这个API的调用是很频繁的。由于每个cell的高度是动态的,所以每次要做高度计算,都要重新layout一遍,然后得出高度,这块计算量是比较大的。sunny通过将每个cell的计算好的高度缓存起来,下次获取相同位置cell的高度的时候,直接返回缓存的高度。

同时,当第一次reloadData,或者cell的行数发生变化(增减行,section) ,会先在tableview不处于滚动状态的时候异步计算那些没有被计算过的cell的高度,做预缓存,这块非常赞。就是使用者需要小心,由于这块是异步的, tableview delegate有可能会在预缓存计算的时候不存在了,导致程序崩溃,所以使用者在tableview需要析构的时候,在对应的tableview controller的dealloc中讲self.tableview.delegate = nil;,确保delegate后续不会是一个脏对象。

fd_heightForCellWithIdentifier: cacheByIndexPath: configuration: 

  1. 如果没有打开预缓存开关,则打开该开关,然后异步做一遍预缓存行高计算
  2. 如果缓存了改行的高度则返回行高
  3. 如果么有缓存,则计算行高fd_heightForCellWithIdentifier: configuration,缓存行高并返回

fd_heightForCellWithIdentifier: configuration

  1. 首先获取针对这个identifier类型的模板cell,sunny为每一个类型cell都缓存了一个模板cell,这块我还不明白为什么要这么做,为什么不直接用系统dequeue的重用cell来做?
  2. 将需要计算高度的cell数据填充到这个template cell,然后就可以计算cell高度了
  3. 计算tableview.contentView的真实宽度。
    1. 如果有定制accessoryView,则去除这个宽度
    2. 如果有系统accessoryView展示,则去除对应的宽度。
  4. 检查是否是否是自动布局,判断是否自动布局的标准是contentView本身至少存在一个约束。所以我们在CustomCell做约束的时候,需要至少指定contentView的一个约束。
  5. 如果是自动布局,则将contentView的宽度约束添加进去,这样做的目的是让UILabel之类的内容可能多行的控件适应这个宽度折行(当然前提是我们已经设置好了这些控件的布局约束)。然后调用systemLayoutSizeFittingSize来计算高度。最后移除刚才临时添加的contentView宽度约束。
  6. 如果是绝对布局,则custom cell要重写sizeThatFits接口自己提供行高计算。如果没有重写,则会报错。
  7. 如果存在分割线,则添加1px的高度。因为CGSize是基于point,所以高度计算是 1/[UISscreen mainScreen].scale
  8. 返回计算好的高度。

免责声明:文章转载自《UITableView+FDTemplateLayoutCell源码学习笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇boost 系列 1:boost 直接使用Java生鲜电商平台-供应链模块的设计与架构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

uitableview 优化

1. http://www.cocoachina.com/ios/20150602/11968.html 最近在微博上看到一个很好的开源项目VVeboTableViewDemo,是关于如何优化UITableView的。加上正好最近也在优化项目中的类似朋友圈功能这块,思考了很多关于UITableView的优化技巧,相信这块是难点也是痛点,所以决定详细的整理下...

入门者初试 Cell(华表)结合C#的应用

本次内容主要包括1.Cell(华表)与VS.NET中常用报表 的 对比参照2.简单的Cell(华表)在C#中的示例因工作需要,现开始接触Cell(华表),用该国产报表软件进行报表开发。和水晶报表及ReportServices等可以在服务器端进行操作的报表不同,Cell(华表)是需要JavaScript或VBScript在客户端进行操作。 Cell对照VS自...

openpyxl/csv--python处理excel表格模块

#conding='utf-8'#属性方法参考:https://zhuanlan.zhihu.com/p/43186995 #Workbook ;worksheet;active;load_workbook;cell;value;rows;append"""workbook对象属性: active:获取当前活跃的Worksheet worksheets...

android--LinearLayout的child中layout_weight的作用与使用

linearLayout中包含有weight的child时,linearLayout会measure两次: 第一次 测量 child 的 原始值: 第二次 测量 child 的 比重值: 然后将2次测量的值相加,得到child 的具体的宽 或 高。 //----------------------------------------------------...

iPhone用nib/xib文件载入窗口,和用代码写窗口,到底哪个快?(转)

本篇译自:Matt Gallagher的blog-http://cocoawithlove.com原文:http://cocoawithlove.com/2010/03/load-from-nib-or-construct-views-in.html 有人认为iPhone上用代码来构建加载窗口要比用nib文件来得更快。真的假的?下面文章做了一个实验,说明了...

Sql Server 2008 增加字段、修改字段、修改类型、修改默认值

1、修改字段名:   alter table 表名 rename column A to B        -- Sql Server 2016 修改SQL(执行后会有提示:注意: 更改对象名的任一部分都可能会破坏脚本和存储过程。)   exec sp_rename "[dbo].[TBL_00001].id","sex是变更后的名称","column";...