具有 2 个标签的单元格始终“无法同时满足约束”

Posted

技术标签:

【中文标题】具有 2 个标签的单元格始终“无法同时满足约束”【英文标题】:Cell with 2 labels always is 'unable to simultaneously satisfy constraints' 【发布时间】:2015-11-30 00:06:55 【问题描述】:

我有一个带有 2 个简单标签的单元格,我在过去 6 个小时内一直在工作以使其正常工作(在此之前它工作过,并决定修补它并丢失了我的工作版本)。我总是收到Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. 警告。这是我在使用推荐的约束时收到的警告:

    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x7f8fe8737520 V:[UILabel:0x7f8fe873d5a0'Label'(26)]>",
    "<NSLayoutConstraint:0x7f8fe8738ea0 UILabel:0x7f8fe873d7a0'Label'.top == UITableViewCellContentView:0x7f8fe873cf00.topMargin>",
    "<NSLayoutConstraint:0x7f8fe8739000 UILabel:0x7f8fe873d5a0'Label'.bottom == UITableViewCellContentView:0x7f8fe873cf00.bottomMargin>",
    "<NSLayoutConstraint:0x7f8fe8739110 V:[UILabel:0x7f8fe873d7a0'Label']-(NSSpace(8))-[UILabel:0x7f8fe873d5a0'Label']>",
    "<NSLayoutConstraint:0x7f8fe8743ac0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f8fe873cf00(43.6667)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f8fe8737520 V:[UILabel:0x7f8fe873d5a0'Label'(26)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

这是我在故事板中的原型单元(如果您现在还没有弄清楚,这是自定义的):

右下角的小标签是“Sayer”,较大的标签是“Body”。

编辑:作为旁注,我不想限制 body 的高度,因为它是一个标签,其高度取决于其中的文本数量。

编辑 2:使用@siburb 提供的解决方案,警告消失了。但是仍然存在一个新问题,如上面的屏幕显示主体是一个大的 UILabel,我已将其 lines 属性设置为等于 0,因为这应该允许标签根据文本量改变其大小输入。当我运行程序时(在下面的屏幕截图中)我只能看到说 UILabel。正文标签中有文本(我测试过)所以这不是问题。

在我的RecentTableViewController.h(此表视图的文件)中,我包含了该方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    return UITableViewAutomaticDimension;

它应该动态调整 UILabel 的大小,我之前在这个精确的设置中让它工作,但我的约束搞砸了,并不是它不起作用。

编辑 3:这是在编辑 @siburb 响应的部分。

【问题讨论】:

您已将 Sayer 的高度限制为 26,但它的高度也由顶部/底部约束设置,因此存在冲突。自动布局打破了 height=26 约束以解决冲突。要么删除高度约束或顶部或底部约束,要么设置约束的优先级,以便自动布局知道哪个更重要 @brettf - 我在下面的答案中添加了更多信息。希望这会有所帮助。 【参考方案1】:

您需要降低其中一个约束的“优先级”。

尝试将“body”的底部约束的优先级降低到900 - 这将意味着“sayer”的高度约束不会被破坏。

此外,它可能有助于将“body”UILabel 的“垂直内容拥抱优先级”降低到 1 - 这将意味着“body”UILabel 不会那么热衷于坚持其“内在内容”的高度size"(标签内容规定的大小)。

编辑:要解决第二个问题,您可能需要增加“body”UILabel 的“Vertical Content Compression Resistance Priority”。例如,将其增加到 999。

您也不需要heightForRowAtIndexPath: 方法。只需在您的 viewDidLoad: 方法中包含以下内容即可:

self.tableView.estimatedRowHeight = 100; self.tableView.rowHeight = UITableViewAutomaticDimension;

【讨论】:

我降低了身体底部和身体垂直拥抱的优先级,没有像以前那样抛出运行时警告,尽管单元格仍然没有像应有的那样显示,因为是一个不同的问题,我会接受这个答案是正确的。 谢谢。它与此问题有关,因此如果需要,请添加另一个屏幕截图,我很乐意提供进一步的建议。 Ok 将添加屏幕截图。 Edit 2 @siburb 下添加了屏幕截图和其他信息

以上是关于具有 2 个标签的单元格始终“无法同时满足约束”的主要内容,如果未能解决你的问题,请参考以下文章

自动布局约束:无法同时满足约束

iOS - AutoLayout'无法同时满足约束'

SnapKit 自动布局损坏:“无法同时满足约束”

关于单元重用的自定义 UITableViewCell 约束问题

单元格中的破坏约束

自动布局:具有可变高度和两个标签的表格单元格