UITableViewCell 异常咨询:多行UILabel致单元格高度异常
哥们,我之前在做类似布局的时候也碰到过这个问题!你已经做了不少基础设置,但还有几个容易忽略的点,帮你梳理一下:
先确认多行Label的换行配置
这是自动高度生效的前提!确保你的多行UILabel已经开启了自动换行:multiLineLabel.numberOfLines = 0 multiLineLabel.lineBreakMode = .byWordWrapping要是没开这个,就算约束全对,多行文本也不会自动撑开cell高度。
检查约束的「完整性」
你提到设置了固定间距,但必须保证所有控件的约束是从contentView的顶部到底部完全贯通的:从contentView的top到第一个Label的top,Label之间的垂直间距,最后一个Label的bottom到contentView的bottom,这些约束一个都不能少。如果底部约束断了,自动高度就会用预估高度或者默认值,导致文本少的cell高度不对。优先级设置的正确逻辑
文本少的cell高度异常,大概率是优先级冲突了。给你个经过验证的优先级配置参考:- 单行
UILabel的**内容拥抱优先级(Content Hugging Priority)**要高于多行Label(比如单行设251,多行设250),这样单行Label不会被不必要地拉长; - 多行
UILabel的**内容压缩抵抗优先级(Content Compression Resistance Priority)**要高于单行Label(比如多行设751,单行设750),这样多行Label会优先根据内容调整高度,单行Label保持稳定。
- 单行
加个预估高度+强制刷新布局
有时候即使约束全对,也会因为tableView的高度缓存问题导致计算错误。可以在viewDidLoad里加一行预估高度(设一个接近你正常cell的数值就行):tableView.estimatedRowHeight = 80另外在
cellForRowAt方法中,返回cell前强制刷新一下布局:cell.layoutIfNeeded()排查contentView的约束
偶尔会碰到contentView本身的约束出问题,要确保contentView的top、bottom、leading、trailing都和cell的对应边缘有0间距的约束(XIB/Storyboard默认是对的,但手动调整时可能会误删)。
补充:如果你是用XIB或Storyboard创建的cell,一定要在Size Inspector里把cell的
Row Height设为Automatic,别给固定值。
内容的提问来源于stack exchange,提问作者Codetard

