UITableView+FDTemplateLayoutCell 是一个由国人团队开发的优化计算 UITableViewCell 高度的轻量级框架(GitHub 地址),由于实现逻辑简明清晰,代码也不复杂,非常适合作为新手学习其他著名却庞大的开源项目的“入门教材”。
这个框架的目的引用该框架的维护人员的一句话就是“既有 iOS8 self-sizing 功能简单的 API,又可以达到 iOS7 流畅的滑动效果,还保持了最低支持 iOS6”。(注:这里主要讲了autoLayout的使用介绍,frame layout请移步github自行查看框架的说明)
使用
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 只进行高度计算,不会显示到屏幕上
*/
a)// 返回计算好的高度(无缓存)
- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifierconfiguration:(void(^)(idcell))configuration;
b)// 返回计算好的高度,并根据 indexPath 内部创建与之相应的二维数组缓存高度
- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifiercacheByIndexPath:(NSIndexPath*)indexPathconfiguration:(void(^)(idcell))configuration;
c)// 返回计算好的高度,内部创建一个字典缓存高度并由使用者指定 key
- (CGFloat)fd_heightForCellWithIdentifier:(NSString*)identifiercacheByKey:(id)keyconfiguration:(void(^)(idcell))configuration;
一般来说 cacheByIndexPath: 方法最为“傻瓜”,可以直接搞定cell高度的所用问题。cacheByKey: 方法稍显复杂(需要关注数据刷新),但在缓存机制上相比 cacheByIndexPath: 方法更为高效。因此,像类似微博、新闻这种会拥有唯一标识的 cell 数据模型,更建议使用cacheByKey: 方法。
4.当数据产生变化时,如何修改已经缓存的高度呢
a)对于 cacheByIndexPath: 方法,框架内对 9 个触发 UITableView 刷新机制的公有方法分别进行了处理,保证缓存数组的正确;同时,还提供了一个 UITableView 分类方法:
- (void)fd_reloadDataWithoutInvalidateIndexPathHeightCache;这个方法主要应用在下拉刷新上拉加载等,主要场景是需要刷新数据但不想移除原有缓存数据
b)对于 cacheByKey: 方法,当 cell 高度发生改变时,必须手动处理:
// 移除 key 对应的高度缓存
[tableView.fd_keyedHeightCacheinvalidateHeightForKey:key];
// 移除所有高度缓存
[tableView.fd_keyedHeightCacheinvalidateAllHeightCache];
5.该框架对UITableViewFooterView和UITableVIewHeaderView都设计了方法,用法和UITableVIewCell类似
使用
主要是使用xib布局,以前很少使用xib布局这次就尝试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为绝对路径。