iOS tableViewCell自适应行高的计算(8.0及以后)

移动开发 来源:罗同学_ 21℃ 0评论

前言:

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以后苹果为我们提供了一个 estimatedRowHeightUITableViewAutomaticDimension 属性,直译过来分别为 预期高度 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只有部分需要换行等等,这些就需要运用到我们的 约束优先级 相关的知识了。这一块有时间再讲吧