在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中的一个图来表示:
![](https://img.haomeiwen.com/i435323/5c4eaedca6703ec9.png)
如果涉及到的cell布局比较复杂,可能要对某些控件约束的优先级进行一些调整.
4.有小伙伴提到这个框架里面使用了苹果私有方法,可能会影响上架审核.but....经过我与作者的沟通[娇羞],那已经是过去式了,现在的1.2版本去掉了之前的"黑魔法",所以可以放心使用...好嗨森呀
今天得知FDTemplateLayoutCell更新到了1.3版本,现在起,不用 AutoLayout 的同学也可以享受到方便的高度计算和缓存了,这个版本还修复了可能的越界和内存泄露问题,以及github上所有Issue,变得更加稳定,小伙伴们抓紧时间更新吧.-20150528
当约束添加完毕,按照demo中的使用方法去做,不费吹灰之力就能看到结果.如果cell有什么改变,也只需要改动cell本身的控件及约束, 仅此而已! 怎么可以这么简单!
Enjoy your coding!
网友评论
如果heightForRowAtIndexPath返回固定高度则不会报错。
打断点发现是框架的断言。
请问您的registerNib是写在哪里的呢?
[self configureCell:cell atIndexPath:indexPath];
}];
方法后 重新tableview reloaddata 会闪屏应该怎么解决呢?
[tableView fd_heightForCellWithIdentifier:TTIdeaDetailCell configuration:^(id cell) {}];
收到了,看来确实还是有问题。我再研究一下吧。谢谢啦。
你好,我照你说的改了,还是不行,每一行的内容都没有显示完全,最后一行不显示。请问你昨天有发现这样的问题吗?
非常感谢,我今天试试看。
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()
去掉就没有问题了.
已发送。谢谢帮忙。
嗯,不行,configuration看来不能省略。删掉的话会提示:Missing argument for parameter 'configuration' in call
return tableView.fd_heightForCellWithIdentifier("myCell", { (cell: MyTableViewCell) -> Void in
cell.cc = self.cellContentList[indexPath.row]
})
编译没通过,提示:Cannot invoke 'fd_heightForCellWithIdentifier' with an argument list of type '(String, configuration: (MyTableViewCell) -> Void)'
return tableView.fd_heightForCellWithIdentifier("myCell", configuration: { (cell: MyTableViewCell) -> Void in
cell.cc = self.cellContentList[indexPath.row]
})
谢谢。
哈哈~