UITableViewCell自动适配高度问题求助
解决UITableViewCell根据内容自动调整高度的问题
我之前也碰到过一模一样的情况,尤其是滚动前后文本显示异常的问题,咱们一步步来搞定:
一、先把UILabel的约束拉对(最关键!)
你的Label必须和Cell的contentView建立完整的上下左右约束,不能有任何模糊的地方:
- 给Label设置
top、leading、trailing、bottom约束,要么直接贴紧contentView的四个边,要么根据需求留固定间距(比如上下各8pt、左右各16pt) - 一定要确保Xcode的Interface Builder里没有红色/黄色的约束警告,有警告就得先解决,不然自动高度根本没法正常工作
二、配置UILabel的换行属性
Label本身得能正确显示多行文本,否则约束再对也白搭:
- 如果是用Storyboard/XIB创建的Label:把
Lines设为0(表示自动换行),Line Break选Word Wrap - 如果是代码创建Label:
label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping
三、确认TableView的自动高度设置
你已经写了那两行代码,但要确保它们在viewDidLoad这类合适的时机调用:
self.tableView.estimatedRowHeight = 75.0 self.tableView.rowHeight = UITableViewAutomaticDimension
要是你的TableView是在Storyboard里拖的,也可以直接在属性面板里设置这两个值,效果完全一样。
四、调整内容拥抱/压缩阻力优先级(按需)
大部分时候默认优先级就够用,但如果Cell里还有其他视图(比如图片、按钮),就得给Label提优先级:
- 给Label设置较高的垂直内容拥抱优先级,保证它不会被其他视图挤扁
- 同时设置较高的垂直内容压缩阻力优先级,避免文本被截断
用代码设置的话:
在Interface Builder里直接拖动滑块调整就行,更直观。label.setContentHuggingPriority(.defaultHigh, for: .vertical) label.setContentCompressionResistancePriority(.defaultHigh, for: .vertical)
五、解决滚动后仍截断的小技巧
要是滚动后还是有问题,试试刷新数据后调用:
// 全局刷新 self.tableView.reloadData() // 或者只刷新特定Cell self.tableView.reloadRows(at: [indexPath], with: .automatic)
另外,有时候Xcode的缓存会搞事情,你可以按Cmd+Shift+K清理项目后重新运行,说不定就好了。
内容的提问来源于stack exchange,提问作者Alex Smith
相关产品推荐
相关产品推荐

