美文网首页iOS DeveloperiOS DeveloperiOS Developer - UITableView
UITableViewCell高度自适应探索--UITableV

UITableViewCell高度自适应探索--UITableV

作者: CoderAO | 来源:发表于2015-05-19 19:08 被阅读14601次

    在iOS开发中,cell高度的适应始终是一件比较麻烦的事情.
    在我做过的项目中,比较好的方法是让一个类专门通过数据模型来计算cell的高度,然后在tableView代理里面返回算好的高度,这样做耦合度低,利于复用,而且思路非常清晰,但缺点是使用稍显复杂.

    now福利来了,我们有了UITableView+FDTemplateLayoutCell这个开源类,让cell高度的自适应变得格外容易!

    具体的使用方法请戳该类作者博客:http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/
    文章对tableViewCell高度计算的原理及此类的实现原理等解释得非常清晰,具体的使用方法和demo可直接参考文章内容.

    这里只说几个需要注意的点:
    1.使用该类的时候,cell要通过tableView的registerNib...或者registerClass...的方法进行注册(联想UICollectionViewCell的用法),如:

    [tableView registerNib:[UINib nibWithNibName:@"ProdDetailCell" bundle:nil]
    forCellReuseIdentifier:@"ProdDetailCell"];
    

    或者:

    [tableView registerClass:[ProdDetailCell class] 
      forCellReuseIdentifier:@"ProdDetailCell"];
    

    2.如果是在模拟器上运行demo,在快速滑动减速的时候会有轻微的卡顿感,这是模拟器渲染导致的,你可以尝试在真机上运行,非常流畅.

    3.cell内部控件的约束要加得比较全, 依我的使用经验是内部各种竖直方向上的约束要撑满cell的高度,用该类作者Demo中的一个图来表示:

    screenshot1.png
    如果涉及到的cell布局比较复杂,可能要对某些控件约束的优先级进行一些调整.

    4.有小伙伴提到这个框架里面使用了苹果私有方法,可能会影响上架审核.but....经过我与作者的沟通[娇羞],那已经是过去式了,现在的1.2版本去掉了之前的"黑魔法",所以可以放心使用...好嗨森呀
    今天得知FDTemplateLayoutCell更新到了1.3版本,现在起,不用 AutoLayout 的同学也可以享受到方便的高度计算和缓存了,这个版本还修复了可能的越界和内存泄露问题,以及github上所有Issue,变得更加稳定,小伙伴们抓紧时间更新吧.-20150528

    当约束添加完毕,按照demo中的使用方法去做,不费吹灰之力就能看到结果.如果cell有什么改变,也只需要改动cell本身的控件及约束, 仅此而已! 怎么可以这么简单!
    Enjoy your coding!

    相关文章

      网友评论

      • 冷少_前字节:能联系一下你吗,我有一点不太明白
      • 上发条的树:用nib实现的cell,已经在viewDidLoad:中registerNib了。然后还是会报这样的错误:Cell must be registered to table view for identifier
        如果heightForRowAtIndexPath返回固定高度则不会报错。
        打断点发现是框架的断言。
        请问您的registerNib是写在哪里的呢?
      • 男神nick:大神 请教个问题 使用了 [tableView fd_heightForCellWithIdentifier:identifi cacheByIndexPath:indexPath configuration:^(OrderMessageListCell * cell) {
        [self configureCell:cell atIndexPath:indexPath];
        }];
        方法后 重新tableview reloaddata 会闪屏应该怎么解决呢?
      • ec200686b10b:大神收下我的膝盖。
      • zweic:纯代码写的,控件都设置了固定高度,这样不行的,那么他们的高度怎么获取呢? 纠结了好久,求大神解答
      • zweic:有个问题:cell.fd_enforceFrameLayout = NO; 设置成NO了,为什么- (CGSize)sizeThatFits:(CGSize)size这个方法还会执行 好纠结,好痛苦
      • smalldu:哎,用了最新版本的框架发现,用苹果自带的预估高度,fps 60,加了这个反而50多了,有轻微卡顿,我用swift仿写以前runloop方式的版本,新版看代码好像没有在空闲状态去缓存,是吗?
        CoderAO:@大石头布 问问原作者看看,这个框架已经更新到1.5版本了,但1.3后我没再看过
      • cbba0d86b624:展示完页面之后,我又修改了cell,但是好像已经有缓存记录了,所以cell的高度更新不了,改怎么调整啊?
        cbba0d86b624:我自己找到方法了,返回cell高度的时候,换一个方法,不缓存高度就可以了。
        [tableView fd_heightForCellWithIdentifier:TTIdeaDetailCell configuration:^(id cell) {}];
        cbba0d86b624:@CoderAO 哦哦,谢谢
        CoderAO:@舞翼暝幢 去作者github上提个issue问下吧,我没有再研究这个框架了,或者有空时候我研究下,但是可能没这么快
      • 06325c4f157b:这个库现在能兼容swift了吗?
        mqhong:@勋勋2016 能把别人fork的Swift名称或者链接提供一下么,在用Swift搞这个,卡一天了
        06325c4f157b:@CoderAO 我发现了别人fork他的Swift还不错
        CoderAO:@勋勋2016 很久没复习这个框架了,你可以在github上向原作者提问.
      • CoderChou:@CoderAO 此图片screenshot1.png和UITableView-FDTemplateLayoutCell开源项目一模一样,请问和sunnyxx有关系吗
        CoderChou:@CoderAO 看了您这一系列的文章Cell高度自适应文章,满满的收获,good job!
        CoderAO:@菜鸟的尊严 那图就是原作者demo里面的图片,文章里面有说"用该类作者Demo中的一个图来表示".
      • 咖啡bu加糖:cell嵌套tabelview不知道怎么添加tableview在cell的约束 请指点
        一号线:@咖啡bu加糖 有不有啥好方法推荐啊
        咖啡bu加糖:@一号线 不知道计算tableview 高度,所以没有采用这个方案
        一号线:@咖啡bu加糖 求指点,你知道如何利用这个框架做cell嵌套table吗
      • 38386b9a9899:请教一个问题,我使用了该控件,没有用xib布局,cell.fd_enforceFrameLayout = YES,是自己计算高度,全部完成后,非常快速的上下不停拖动的时候,有时候会发生cell里内容错乱的现象,比如第一个cell里的值跑到了第3个cell里,但是计算的cell 高度还是正确的,可以指导一下,大概是什么方面的问题吗?
        CoderAO:@哼哼熊 不知道你问题解决了没有,我由于一些原因很久没有上简书了,这个框架我也一直没有跟进过,你对于这个框架有疑问可以去框架作者的github上Issues里面看看有没有其他人遇到过类似的问题.
      • 小凡凡520:good mark
      • 26d2279189e7:你好,用的是SB,cell使用xib新建的(cell是注册了的),得到高度为0,这是为什么?
      • 南方小金豆:如果tableview 里面有多个不同Cell 类,这个计算高度能使用吗?
        CoderAO:@那份牵挂给了谁 可以,使用方式跟正常tableview使用多种cell原理是一样的
      • Minlay:太不稳定,总是崩溃。而且cell全部重叠,设置竖直约束,cell全部消失
        CoderAO:应该是没用对
      • 微波炉里的小草鱼:大神,在cell里布局个Label 限定3行后,我要点击按钮自适应高度。但是cell的高度不变,只会挤压下面的图片 怎么破 呀 大神求解呀
        CoderAO:图片高度的约束设置了吗
      • 9bfe700d122a:Enjoy your coding! :kissing_closed_eyes:
      • f1febb4a479d:我也遇到和 格式化油条 同样的问题,cell都重叠不知道怎么回事,大神可以给解答下嘛
        CoderAO:@corey_jia 多半是竖直方向约束没加完整,你检查一下。另FD又更新了版本,我后续会讲demo及文章更新
      • RanMeng:我约束和Demo一样 但总是抱约束错误弄了半天都还是不对 能帮我看看吗
      • CoderAO:@_老杨_ 我运行是没问题的 你把沙盒删了再试试,我还换了还几个模拟器试的
      • _老杨_:@CoderAO
        收到了,看来确实还是有问题。我再研究一下吧。谢谢啦。
      • CoderAO:@_老杨_ 你好 修改的代码已经发送至你邮箱
      • _老杨_:@CoderAO
        你好,我照你说的改了,还是不行,每一行的内容都没有显示完全,最后一行不显示。请问你昨天有发现这样的问题吗?
      • _老杨_:@CoderAO
        非常感谢,我今天试试看。
      • CoderAO:@_老杨_ heightForRow...方法里面这样写:
        let height = tableView.fd_heightForCellWithIdentifier("myCell", configuration:{(cell) -> Void in
        let myCell = cell as! MyTableViewCell
        myCell.cc = self.cellContentList[indexPath.row]
        })
        return height;
        参数那里不能修改类型,然后在block里面强转.(swift我不熟,也是问了大神知道的).可以运行后,会有一些约束上的警告,是因为cell中模型的set方法中写多了,把后面两行
        self.contentLabel.sizeToFit()
        self.layoutIfNeeded()
        去掉就没有问题了.
      • _老杨_:@CoderAO
        已发送。谢谢帮忙。
      • CoderAO:@_老杨_ 如果不是商业项目是否能发一份给我邮箱32862082@qq.com
      • _老杨_:@CoderAO
        嗯,不行,configuration看来不能省略。删掉的话会提示:Missing argument for parameter 'configuration' in call
      • CoderAO:@_老杨_ 写成这样试试看?
        return tableView.fd_heightForCellWithIdentifier("myCell", { (cell: MyTableViewCell) -> Void in
        cell.cc = self.cellContentList[indexPath.row]
        })
      • _老杨_:@CoderAO
        编译没通过,提示:Cannot invoke 'fd_heightForCellWithIdentifier' with an argument list of type '(String, configuration: (MyTableViewCell) -> Void)'
      • CoderAO:@_老杨_ 报错是报的什么错?
      • _老杨_:请教一个问题:用这个类的时候,heightForRowAtIndexPath方法里,swift版本应该怎么写呢?我的写法如下,但是报错了。
        return tableView.fd_heightForCellWithIdentifier("myCell", configuration: { (cell: MyTableViewCell) -> Void in
        cell.cc = self.cellContentList[indexPath.row]
        })
        谢谢。
      • CoderAO:@格式化油条 如果你是使用自动布局那么应该不需要实现sizeThatFits的。你先确定下是否是由于自动布局导致的崩溃,先去掉所有约束看看是否崩溃;如果没问题,再试试在cell的初始化方法里面添加约束。如果还是不行,再留言给我看看。
      • 我是乔忘记疯狂:“经过我与作者的沟通[娇羞]”
        哈哈~

      本文标题:UITableViewCell高度自适应探索--UITableV

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