iPhone 6+ 的约束打破了动态调整单元格的大小

Posted

技术标签:

【中文标题】iPhone 6+ 的约束打破了动态调整单元格的大小【英文标题】:Constraints breaking for iPhone 6+ with dynamically sizing cells 【发布时间】:2015-12-22 08:19:11 【问题描述】:

我有一个 UITableViewCell 设置如下:

带有日期、分隔线 (UIView) 和文本字段的图像。约束设置如下:

图像:pin top top、后缘和前缘、纵横比启用。

日期:固定到顶部(图像)、前导、固定高度和宽度

分隔符:固定到顶部(日期)、尾随、前导、固定高度

文本:固定到顶部(分隔线)、底部、尾随、前导、固定高度

我希望单元格根据内容的大小动态改变大小,所以在我的 UITableViewController 中我有:

tableView.estimatedRowHeight = 254
tableView.rowHeight = UITableViewAutomaticDimension

我已经为 iPhone4、iPhone5 和 iPhone6 测试过它。一切正常。但是对于 iPhone6+,我在控制台中收到错误消息: 在 UIViewAlertForUnsatisfiableConstraints 创建一个符号断点,以便在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

不过在模拟器中看起来还不错。我在这里做错了什么?如果其他手机尺寸的单元格和视图尺寸正确,那么为什么它会在 6+ 时损坏?

任何关于这方面的建议都会很棒!

【问题讨论】:

【参考方案1】:

我相信您知道自动布局约束的工作原理。自动布局约束只不过是数学表达式,每次布局视图时都会对它们进行评估。

在您的情况下,您的约束说明: 调整大小后图像的高度保持纵横比+日期选择器高度(固定)+分隔符高度(固定)+文本字段高度+从文本字段到底部布局指南的距离(固定)=行高;

现在这显然会破坏自动布局约束,因为您已经指定了从底部布局到文本字段的固定距离。

这里发生的是,无论行的大小如何,ios 都会尝试保持文本字段底部和行底部之间的固定距离。这将导致约束链中断。

这个约束是完全没有必要的。正如您已经通过将引脚指定到顶部(分隔线)、尾随、前导、固定高度来指定文本字段的最低要求约束 :)

虽然移除约束会解决约束破坏问题,但你的设计伙伴仍然存在问题。

编码愉快:)

【讨论】:

UITableViewAutomaticDimension 工作实际需要的底部约束。我明白你对打破约束的意思。我设法通过从文本字段中删除固定高度来修复它,并且可以灵活地适应它。设计有什么问题? ohhhh 抱歉,我完全忽略了 UITableViewAutomaticDimension,我的错。在没有 UITableViewAutomaticDimension 的情况下,我提到的删除底部约束将导致一些其他 UI 问题,这就是我的意思:) 因为您在其他组件上也有固定宽度约束 :) 很好,您解决了这个问题 :)【参考方案2】:

尝试将确定高度的约束之一的优先级更改为 999 而不是 1000。例如,最后一个到底部的约束。它通常会在单元格计算其高度并且看起来相同时消除约束破坏的问题。

【讨论】:

以上是关于iPhone 6+ 的约束打破了动态调整单元格的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 uitableview 调整单元格的大小(在停用高度约束后)?

UiTableViewCell 动态高度适用于 iphone 而不是 ipad 大小类

UITableView 自动调整行约束在 iPhone 6Plus 上神秘地打破

4.4 和 5.5 英寸的 UICollectionViewCell 动态调整大小

动态调整自定义 xib 单元格的大小

如何通过自动布局设置集合视图单元格大小