求助:UITableView单元格无法正确展开、内容被截断的原因
这种情况我做项目时也碰到过,明明配置和其他TableView一致,但运行就出问题,大概率是以下几个细节没处理到位,给你逐一排查:
单元格自动高度未正确配置
Storyboard里显示正常是因为默认用了静态行高,但运行时动态加载内容需要让TableView自动计算高度。你需要在代码里添加:tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 44 // 填一个接近你单元格实际高度的预估数值即可另外,单元格内部的子控件必须有完整的约束链(比如从顶部到底部的连续约束,确保系统能算出单元格的总高度),哪怕你觉得“看起来不用约束”,运行时系统没有约束参考就会乱截断内容。
布局方向被意外修改
检查两个地方:一是你的ViewController的view.semanticContentAttribute有没有被错误设置(比如不小心设成了.forceRightToLeft);二是自定义单元格的子控件有没有被修改过布局方向。可以在cellForRowAt方法里打印一下单元格的布局属性,确认和预期一致:print(cell.semanticContentAttribute)单元格复用导致的布局残留
如果用了自定义UITableViewCell,检查prepareForReuse方法里有没有重置布局相关的属性。比如之前的单元格被修改过约束、隐藏过控件,复用的时候没恢复初始状态,就会导致显示异常。举个例子,你可以在这个方法里重置子控件的状态:override func prepareForReuse() { super.prepareForReuse() // 重置所有可能影响布局的属性,比如: titleLabel.text = nil contentView.constraints.forEach { $0.isActive = true } // 确保约束都处于激活状态 }TableView本身的布局问题
虽然你说没设置约束,但Storyboard里的TableView有没有和父视图建立正确的布局关系?比如TableView的top、bottom、leading、trailing是不是都和父视图对齐?运行时可以用Xcode的Debug View Hierarchy工具查看TableView的实际frame,看看是不是被压缩或者超出了父视图范围,这也会导致单元格内容显示异常。
内容的提问来源于stack exchange,提问作者Runeaway3

