苹果从iOS7开始就支持用AutoLayout来计算UITableViewCell的高度了,只要对UITableView的estimatedRowHeight属性设置一个非0值就可以开启。但是发现到现在好像还是有些同学不知道这个功能😂。
为了更好的解释自动布局是怎么在其中发挥作用的,所以决定从最基本的布局说起。
一个视图要想确定自身的位置,那么必须要知道其尺寸和位置,尺寸就是宽度和高度。位置有中心点坐标,或者左上角坐标等。。
举个栗子🌰:
![](https://img.haomeiwen.com/i9501625/8bdc58b411df0b11.png)
![](https://img.haomeiwen.com/i9501625/9d369727e7572204.png)
但是! 这是有前提的。我们假定了白色视图的大小和位置已经确定!如果白色视图的位置大小不确定,那么绿色视图也自然没有办法算出自己的位置大小。这就是UITableViewCell上布局是和在ViewController的view上布局的不同了,应为ViewController的主视图大小是预先确定了的。如果TableView没有开启自动计算高度(也就是estimatedRowHeight的值为0)那么Cell的大小也是可以确定了的(宽度为TableView的宽度,高度为rowHeight的值或者代理方法返回的值) 其实离目标只差一条约束了!开启了TableView自动计算高度后Cell的宽度是有了,但是还差一个高度。所以我们再添加一条约束用来确定Cell的高度。这时,TableView就可以正常的自动计算高度了。
![](https://img.haomeiwen.com/i9501625/a766dbe4714a8d73.png)
![](https://img.haomeiwen.com/i9501625/70a228b614116aa9.png)
再加入Label试试,由于Label自身可以根据文本内容算出尺寸,所以不需要独立设置高度约束。约束如下。
![](https://img.haomeiwen.com/i9501625/7f43c53a80fcaa25.png)
![](https://img.haomeiwen.com/i9501625/1aafd7bf8b4d764d.png)
一些坑
- 记得设置estimatedRowHeight为非0值。
- 约束要添加在Cell的contentView上,而不是Cell本身。
- estimatedRowHeight的值最好大于Cell的平均高度,不然在一些情况下设置偏移量会不正确。
源码在 这里
网友评论