问题描述
在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此时的宽度也确实是随机的,但是显示结果却正确+_+