前言:
tableView cell 自适应在我们的日常开发中经常会用到,假如你使用的是autolayout布局并且最低支持的版本是8.0及以上,本文可能会对你有所帮助
栗子:
效果如图,最终实现的是第三行文字高度自适应,来看下我们的实现
-
代码部分(swift):
override func viewDidLoad() {
super.viewDidLoad()
self.tableview.estimatedRowHeight = 80
self.tableview.rowHeight = UITableViewAutomaticDimension
// Do any additional setup after loading the view, typically from a nib. }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
var contentText = "这是一段很长的文字"
for _ in 0...arc4random()%5 {
contentText = contentText + "这是一段很长的文字"
}
cell.contentLabel.text = contentText
return cell }
** 解释:iOS8以后苹果为我们提供了一个 estimatedRowHeight 和 UITableViewAutomaticDimension 属性,直译过来分别为 预期高度和 tableView自动尺寸**,第一段代码的意思是设置tableView的预期高度为80并且设置tableView的行高为自动计算行高后所得到的值(当然这两个属性也可以通过相应的代理方法进行设置),cellForRow和我们以往一样。这样在约束好以后,它就会自动帮我算好行高,可以这么理解,系统会帮我们把cell的行高算好,然后自动把这个值匹配给我们相应的cell。
要实现这种效果还有一个重点就是关于 约束的问题,我们的约束必须要满足 self-sizing cell,简单来说就是我们需要换行高的那个label需要有相对于cell上下左右的约束(直接的约束或者通过其他控件的间接约束),我们来看下栗子里的约束情况
- 约束部分:
上边约束:距离subtitleLabel的底部为4
左边约束:图第三个约束,内容为与subtitleLabel的左边相等
下边约束:距离cell下边距离为 14
右边约束:距离cell右边距离为26
解释:我们可以看到下和右边的约束是直接相对于cell的,而其他两个约束都是相对于subtitleLabel的,为了满足我们上面讲的 self-sizing cell,我们的subtitleLabel就必须满足有相对于cell左边和上边的约束,而我们的subtitleLabel的部分约束又是相对于titleLabel的,所以titleLabel也要满足相应的约束要求,总之,最后我们自动行高的label必须满足有相对于cell上下左右的约束,才可实现行高的自动适应
总结:
这是一个最简单的一个例子,可能我们的需求会是各种各样的情况,比如我们需要多个label自适应,水平方向有多个label,某行或者某列有多个label只有部分需要换行等等,这些就需要运用到我们的 约束优先级 相关的知识了。这一块有时间再讲吧