美文网首页iOS进阶iosswift3.0学习
UITableView+FDTemplateLayoutCell

UITableView+FDTemplateLayoutCell

作者: ElliotYamin | 来源:发表于2017-04-10 14:50 被阅读2983次

    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为绝对路径。

    相关文章

      网友评论

      • 0792bc92b5c4:你好,我不是xib 创建的tableviewcell 怎么弄啊?
        ElliotYamin:@never_小土豆 marsoy也可以啊
        只要是满足竖直方向上约束够就行
      • 凤栖林:这样做和系统比的优势在哪里?我用系统的UITableViewAutomaticDimension计算高度不是更快吗? 对于缓存高度那里,可以解决卡顿问题,还有其他优点吗
        ElliotYamin:系统的会调用多次哦性能上优势对比明显
      • lzp_John:我用纯代码的方式+UITableView+FDTemplateLayoutCell ,但是返回来的高度一直都是45,设置了self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth; 也还是没有用 ,请问下可能是什么原因呢
        ElliotYamin:@lzp_John 约束只要垂直方向上约束够就行了
        lzp_John:对最下面的view也做了bottom的约束
      • paintingStyle:哎呦不错哦:smile:
        ElliotYamin:@paintingStyle 双福大神带带我
      • 蜜锋将有小肚腩:老哥,我纯代码总是崩
        ElliotYamin:@爱吹水的蜜蜂 崩溃的原因是什么啊,你把错误发出来看下
      • 动感超人丶:写的非常好!!!!!解决了我一个心腹大患的问题
        ElliotYamin:不算好了,我自己都感觉很差
      • ElliotYamin:大家有什么疑问可以提出来,第一次写简书,需要大家多批评多指教
        ElliotYamin:@蓝色的耗子 swift的版本暂时还没研究 最近项目比较忙
        随一帆扬:你好,我用swift 写了一个例子,但是没有效果,请问你知道怎么解决吗

      本文标题:UITableView+FDTemplateLayoutCell

      本文链接:https://www.haomeiwen.com/subject/fapsattx.html