使用Autolayout或约束对多行文本Label进行布局,高度不准确(文字截断)的解决办法

问题描述

在xib或者storyboard(也许还有纯代码)使用约束或者autolayout布局之后,UILabel载入多行文字时高度计算不准确,造成文字截断,显示不全。

解决方法

设置label.preferredMaxLayoutWidth属性,使其等于label的实际宽度即可解决问题

  // UITableViewCell子类中,实际测试无效
  override func layoutSubviews() {
    super.layoutSubviews()
    cell.contentView.layoutIfNeeded()
    cell.label.preferredMaxLayoutWidth = cell.label.frame.width
  }
  // UITableView子类中,实际测试有效
  override func tableView(_ tableView: UITableView, cellForRowAt indexPaht: IndexPath) -> UITableViewCell {
    let cell = YourTableViewCell()
    // ...
    // cell.contentView.layoutIfNeeded()    // 实测不需要
    cell.label.preferredMaxLayoutWidth = cell.label.frame.width
    return cell
  }

这里需要注意调用cell.contentView的layoutIfNeeded方法,理论上通过这个方法可以获得准确的cell.label.frame.width,但是实测时不使用该方法也可以

特别提示

本文中的方法没有任何理论依据,仅通过实际操作可能确认。

理论上在UITableViewCell子类中重载layoutSubviews方法更加可行,但是实际测试却不能立即生效,cell第一次显示时依然可能存在被截断的问题,第二次以后显示正常。

而实际可行的方法中,cell还没有加载到视图,label宽度更是无从计算,不知道系统是如何得出正确的尺寸的。在调试输出label此时的宽度也确实是随机的,但是显示结果却正确+_+

你可能感兴趣的:(使用Autolayout或约束对多行文本Label进行布局,高度不准确(文字截断)的解决办法)