UITableView自动计算Cell高度思路
本文只介绍思路,具体代码网上已经有很多,这里就不在粘贴了。希望正在阅读的童鞋能理解思路,然后自己去实践。
一:对于固定高度Cell的计算:
推荐:
tableView.rowHeight = 45;
不推荐:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 45
}
二:对于动态高度Cell的计算:
1、手动计算
使用系统的boundingRect计算出文本的高度,然后:
Cell总高度 = 文本高度 + top距离 + bottom距离

对于高度计算复杂的Cell,计算后将高度缓存在对应Cell的数据Model里。在heightForRow返回高度前,先判断一下Model是否缓存高度,如果有值,就直接返回。如果没值,就去计算,缓存,下次直接使用。
2、自动计算
使用iOS8的新特性。
tableView.estimatedRowHeight = 45;// 设置一个预估高度
tableView.rowHeight = UITableViewAutomaticDimension;// 告诉系统要自动计算高度(可省略)
前提是你已经给Cell设置好了完整的约束
对于 estimatedRowHeight 的值,可以设置得和所有 Cell 的平均值一样,这样TableView可以计算最少的cell
在 iOS8 中使用了 Cell 自动高度之后,你会发现,只要一个 Cell 需要被显示到屏幕上,它的高度都会被计算一次,即使这个 Cell 在之前的滑动中已经被计算过高度了。之所以被设计成这样的原因系统认为 Cell 的高度是随时可能改变的。
3、手动+"自动"
如果Cell中既有图片,又有文本,我们想手动计算图片,自动计算文本(使用sizeToFit计算)。
第一步、首先设置预估高度和自动计算:
tableView.estimatedRowHeight = 45;
tableView.rowHeight = UITableViewAutomaticDimension;
第二步、如果你设置了1中的代码,那么tableview执行时,会先执行cellForRow而不是直接执行heightForRow。此时你就可以在Cel赋值的代码里计算高度,然后把高度缓存在对应Cell的Model里。
第三步、实现heightForRow代理,并返回在Cell里已经缓存的高度。
sizeToFit 和 sizeThatFits 的使用区别
苹果官方解释
// return 'best' size to fit given size. does not actually resize view. Default is return existing view size
let size = contentLabel.sizeThatFits(CGSize(width: 200, height: CGFLOAT_MAX))
// calls sizeThatFits: with current view bounds and changes bounds size.
contentLabel.sizeToFit()
sizeToFit:让view自动根据内容计算自己的bounds,并且修改自己的bounds。sizeToFit最后也是调用的sizeThatFits。
sizeThatFits:会计算出最优的 size 但是不会改变 自己的 size