zoukankan      html  css  js  c++  java
  • UITableView+FDTemplateLayoutCell源码学习笔记

    本文转载至  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. 返回计算好的高度。
  • 相关阅读:
    C++ 面向对象编程3 封装 继承 多态
    C++ 面向对象编程2
    C++ 面向对象编程1
    C++开发环境和基础语法
    RTOS概述
    STM32F4 窗口看门狗(WWDG)
    STM32F407 独立看门狗 (IWDG)
    DHT11温湿度传感器
    Ubuntu20.04安装、配置、卸载QT5.9.9与QT creator以及第一个编写QT程序
    Linux,Ubuntu20.04LTS环境下安装JDK1.8和IDEA2021
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/4901069.html
Copyright © 2011-2022 走看看