UITableView性能优化---自动计算cell高度(FDTemplateLayoutCell)

来源:互联网 发布:mac air11寸 编辑:程序博客网 时间:2024/05/19 21:42

1、使用前提

和每个 UITableViewCell ReuseID 一一对应的 template layout cell

这个 cell 只为了参加高度计算,不会真的显示到屏幕上;它通过 UITableView 的 -dequeueCellForReuseIdentifier: 方法 lazy 创建并保存,所以要求这个 ReuseID 必须已经被注册到了 UITableView 中,也就是说,要么是 Storyboard 中的原型 cell,要么就是使用了 UITableView 的 -registerClass:forCellReuseIdentifier: 或 -registerNib:forCellReuseIdentifier:其中之一的注册方法。

例:

NSString *const MJMCommentViewCell = @"MJMCommentViewCell";


自动布局

2、使用方法

修改TableViewDelegate方法

例:




重写模板中的sizeThatFits方法(例:JMCommentViewCell)

例:


注:(1)totalHeight依次累加控件高度和控件间的间隔,不需要累加所有控件,只需要累加计算cell高度需要的控件即可;(2)添加图片计算高度时会有问题,返回的是图片的真实高度,而不是控件高度(设置尺寸也不起作用),如果图片控件高度已知或一定,可以累加该高度。

3、根据 index path 的高度缓存机制

计算出的高度会自动进行缓存,所以滑动时每个 cell 真正的高度计算只会发生一次,后面的高度询问都会命中缓存,减少了非常可观的多余计算。

- (CGFloat)fd_heightForCellWithIdentifier:(NSString *)identifier cacheByIndexPath:(NSIndexPath *)indexPath configuration:(void (^)(id cell))configuration;

- (CGFloat)fd_heightForCellWithIdentifier:(NSString *)identifier cacheByKey:(id)key configuration:(void (^)(id cell))configuration;

自动的缓存失效机制

当调用如-reloadData,-deleteRowsAtIndexPaths:withRowAnimation:等任何一个触发 UITableView 刷新机制的方法时,已有的高度缓存将以最小的代价执行失效。如删除一个 indexPath 为 [0:5] 的 cell 时,[0:0] ~ [0:4] 的高度缓存不受影响,而 [0:5] 后面所有的缓存值都向前移动一个位置。自动缓存失效机制对 UITableView 的 9 个公有API都进行了分别的处理,以保证没有一次多余的高度计算。

0 0
原创粉丝点击