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 即
cell
的identifier
;
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、该框架对
UITableViewFooterView
和UITableVIewHeaderView
都设计了方法,用法和UITableVIewCell
类似
使用篇
主要使用xib布局
再布局这里的时间遇到一个问题就是布局冲突了,为了给
contentVIew
充足的约束,我在给collectionView
添加约束时上下左右都添加了同时还设置collectionView.height
这样就导致约束多余了,约束了上下约束高度也就定了,所以就不需要height这个约束,但是height
又是动态变化的,必须要拿到height
的约束才能动态变化高度,这时我就遇到了一个问题,添加了height
就报约束冲突了,解决办法就是所有约束添加完了之后选中collectionView
然后点击如下
添加一个独立的高度约束方便在配置`cell`时动态改变`collectionView`的高度然后你会发现约束冲突了
这时你需要修改height的优先级如图
ok约束设置好了,完整的布局就是图1下面就是把height的约束拖出来然后根据数据动态改变collectionView的高度了
最后关键代码框架的使用方法`ViewController`的代码很简单的没有多余的代码
再`cell.m`中实现`set`方法在方法里面根据数据动态的计算`collectionView`的高度
运行效果如下
GitHub 下载地址<https://github.com/ZhangQiJin/ElliotYamin.git> (在首页点击 “附件量体师进去”)工程编译不过是因为pch是相对路径导致的,请自行修改pch为绝对路径。