iPhone 6Plus 上的 UITableView 自动调整行约束神秘地中断

UITableView auto resizing row constraint breaking mysteriously on iPhone 6Plus

我有一个自定义的 UITableViewCell,它有一个缩略图和一堆文本。行高配置为使用

自动计算
tableView.estimatedRowHeight = 129;
tableView.rowHeight = UITableViewAutomaticDimension

行高应精确计算为 138 点。 iPhone 5 上的一切看起来都很棒。但是,在 iPhone 6 Plus 上,自动行高对于具有以下日志的随机行间歇性失败。

(
    "<NSLayoutConstraint:0x17009ddd0 V:|-(20)-[scoop.ThumbnailImage:0x124d2a5a0]   (Names: '|':UITableViewCellContentView:0x124e23200 )>",
    "<NSLayoutConstraint:0x17009de70 UITableViewCellContentView:0x124e23200.bottomMargin == scoop.ThumbnailImage:0x124d2a5a0.bottom + 20>",
    "<NSLayoutConstraint:0x17009e780 V:[scoop.ThumbnailImage:0x124d2a5a0(90)]>",
    "<NSLayoutConstraint:0x17009ef00 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x124e23200(138.333)]>"
)

日志的最后一行似乎说由于某种原因,行高被计算为 138.333 而不是 138。我一直在敲我的头一段时间,但我无法弄清楚为什么会这样。有人可以帮忙吗?

更新:这就是我的 table 视图单元格的样子。

UPDATE 我无法从主仓库中获取代码,因为它是一个更大项目的一部分。但我已经设法用一个非常简单的理智项目重现了这个问题。请在这里找到它 on github.

警告是在告诉您问题所在,但您可能没有意识到。前三个约束适用于 90 像素高的图像,该图像位于容器顶部以下 20 像素,容器底部以上 20 像素 margin。那是130,这与第四个约束不兼容,它希望总高度为138。但是,由于底部边缘约束是相对于容器的margin,因此增加了一定数量的像素更多。要么删除总高度限制(我的建议),要么更改顶部和底部边缘量。

此警告告诉您约束中存在冲突。 将高度限制的优先级降低到 999,它就会消失。在您的 Github 项目中对其进行了测试并且运行良好。

3 倍比例显示(iPhone 6+ 是)上的

0.333 可能与电池分隔符有关。

请注意,您的约束不会设置单元格的大小,它们会设置 contentView 的大小。但是单元格必须为单元格分隔符的单元格高度添加 2 个像素(= 0.666 点)。 Autolayout 尝试将视图位置保持在整数边界上,因此向单元格高度添加 0.666 点可能会导致向内容高度添加 0.333。

您可以通过将 table 分隔符设置为 None 来避免错误。虽然将其中一个优先级设置为 999(通常是最低优先级),但正如另一个 所建议的那样,通常是一个很好的解决方案。