UITableView+FDTemplateLayoutCell 自动计算cell高度 朋友圈

UITableView+FDTemplateLayoutCell是一个由国人团队开发的优化计算 UITableViewCell 高度的轻量级框架https://github.com/forkingdog/UITableView-FDTemplateLayoutCell
由于实现逻辑简明清晰,代码也不复杂,非常适合作为新手学习其他著名却庞大的开源项目的“入门教材”

使用步骤

1、引用 UITableView+FDTemplateLayoutCell.h

2、不论是代码创建还是xib都需要进行cell注册(类似UICollectionViewCell)

-(void)registerClass:(nullableClass)cellClassforCellReuseIdentifier:(NSString*)identifier;(代码)
-(void)registerNib:(nullableUINib*)nibforCellReuseIdentifier:(NSString*)identifier;(xib)

3、在 tableView: heightForRowAtIndexPath: 代理方法中调用以下三个方法之一完成高度获取

/*identifier 即 cellidentifier
configuration block 中的代码应与数据源方法 tableView: cellForRowAtIndexPath: 中对cell的设置代码相同
方法内部将根据以上两个参数创建与 cell 对应的 template layout cell,这个 cell 只进行高度计算,不会显示到屏幕上
*/

方法一- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifierconfiguration:(void(^)(idcell))configuration;// 返回计算好的高度(无缓存)
方法二- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifiercacheByIndexPath:(NSIndexPath*)indexPathconfiguration:(void(^)(idcell))configuration;//返回计算好的高度,并根据 indexPath 内部创建与之相应的二维数组缓存高度
方法三- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifiercacheByKey:(id)keyconfiguration:(void(^)(idcell))configuration//返回计算好的高度,内部创建一个字典缓存高度并由使用者指定 key
一般来说 `cacheByIndexPath:` 方法最为“傻瓜”,可以直接搞定cell高度的所用问题。`cacheByKey:` 方法稍显复杂(需要关注数据刷
新),但在缓存机制上相比 `cacheByIndexPath: `方法更为高效。因此,像类似微博、新闻这种会拥有唯一标识的 `cell` 数据模型,更建议使用`cacheByKey: `方法
4、当数据产生变化时,如何修改已经缓存的高度呢

a)对于cacheByIndexPath: 方法,框架内对 9 个触发 UITableView 刷新机制的公有方法分别进行了处理,保证缓存数组的正确;同时,还提供了一个UITableView 分类方法:
-(void)fd_reloadDataWithoutInvalidateIndexPathHeightCache;这个方法主要应用在下拉刷新上拉加载等,主要场景是需要刷新数据但不想移除原有缓存数据
b)对于 cacheByKey:方法,当 cell 高度发生改变时,必须手动处理调用如下方法清除缓存高度

[tableView.fd_keyedHeightCacheinvalidateHeightForKey:key];//移除 key 对应的高度缓存
[tableView.fd_keyedHeightCacheinvalidateAllHeightCache];//移除所有高度缓存
5、该框架对UITableViewFooterViewUITableVIewHeaderView都设计了方法,用法和UITableVIewCell类似

使用篇

主要使用xib布局


image

再布局这里的时间遇到一个问题就是布局冲突了,为了给contentVIew充足的约束,我在给collectionView添加约束时上下左右都添加了同时还设置collectionView.height这样就导致约束多余了,约束了上下约束高度也就定了,所以就不需要height这个约束,但是height又是动态变化的,必须要拿到height的约束才能动态变化高度,这时我就遇到了一个问题,添加了height就报约束冲突了,解决办法就是所有约束添加完了之后选中collectionView然后点击如下

image
添加一个独立的高度约束方便在配置`cell`时动态改变`collectionView`的高度然后你会发现约束冲突了
image
这时你需要修改height的优先级如图
image
ok约束设置好了,完整的布局就是图1下面就是把height的约束拖出来然后根据数据动态改变collectionView的高度了
image
最后关键代码框架的使用方法`ViewController`的代码很简单的没有多余的代码
image
再`cell.m`中实现`set`方法在方法里面根据数据动态的计算`collectionView`的高度
image
运行效果如下
image
GitHub 下载地址<https://github.com/ZhangQiJin/ElliotYamin.git> (在首页点击 “附件量体师进去”)工程编译不过是因为pch是相对路径导致的,请自行修改pch为绝对路径。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容