iOS之家Swift之家

UITableView自动计算Cell高度思路

2018-07-24  本文已影响3人  小小土豆dev

本文只介绍思路,具体代码网上已经有很多,这里就不在粘贴了。希望正在阅读的童鞋能理解思路,然后自己去实践。

一:对于固定高度Cell的计算:

推荐:

tableView.rowHeight = 45;

不推荐:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return 45

}

二:对于动态高度Cell的计算:

1、手动计算

使用系统的boundingRect计算出文本的高度,然后:

Cell总高度 = 文本高度 + top距离 + bottom距离

cell

对于高度计算复杂的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

上一篇下一篇

猜你喜欢

热点阅读