自定义 UITableViewCell 垂直布局约束导致错误

Posted

技术标签:

【中文标题】自定义 UITableViewCell 垂直布局约束导致错误【英文标题】:Custom UITableViewCell vertical layout constraints causing error 【发布时间】:2014-12-10 12:12:26 【问题描述】:

当我在 iPhone 上运行我的应用程序时,我收到以下错误。当我在模拟器中运行它时,我没有。如果我把-12-| 拿走,那么单元格的高度就会塌陷到30 像素左右。用户界面坏了。 谁能帮助我并告诉我为什么?

谢谢

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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSLayoutConstraint:0x170285ff0 V:|-(12)-[UIImageView:0x1741ec200]   (Names: '|':UITableViewCellContentView:0x17419c7d0 )>",
"<NSLayoutConstraint:0x170286040 V:[UIImageView:0x1741ec200(200)]>",
"<NSLayoutConstraint:0x170286090 V:[UIImageView:0x1741ec200]-(12)-|   (Names: '|':UITableViewCellContentView:0x17419c7d0 )>",
"<NSLayoutConstraint:0x174881f40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17419c7d0(224)]>"
)
Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x170286090 V:[UIImageView:0x1741ec200]-(12)-|   (Names: '|':UITableViewCellContentView:0x17419c7d0 )>
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.
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Unable to simultaneously satisfy constraints.

在自定义的UITableViewCell 中,我定义了布局约束如下:

_imgView.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[imageView]-15-|" options:0 metrics:nil views:@ @"imageView": _imgView ]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-12-[imageView(200)]-12-|" options:0 metrics:metrics views:@ @"imageView" : _imgView ]];

--- 编辑 ---

针对contentView.bounds 的建议: 在我的UITableViewController 中,我实现了以下内容:

_tableView.rowHeight = UITableViewAutomaticDimension;
_tableView.estimatedRowHeight = 30.0f;

所以零高度应该不是问题。

【问题讨论】:

您好,根据您的问题,似乎限制在设备上被打破,但在模拟器上却没有。您似乎正在尝试在单元格中设置图像视图高度。当您在模拟器和设备上运行时,您能否添加模拟器和设备的图像以及日志屏幕。唯一的原因似乎是由于表格视图单元格的高度。 【参考方案1】:

单元格的初始高度可能小于垂直约束。这会产生初始高度冲突,直到 contentView 的框架发生变化。

您可以使用以下方法之一解决此问题:

增加故事板中单元格的高度以最初适合内容。

将单元格的 contentView 的边界更改为更大的尺寸:

self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);

您将在this auto layout question 的答案中找到更多详细信息。

更新

“无法同时满足约束”的冲突发生在试图将单元格高度设置为 225 点的 imageView 约束与试图将单元格高度设置为 224 点的固定高度之间。

您的 imageView 垂直约束使用 224 (12 + 200 + 12) 个点。 tableView 分隔符使用 1 个点。因此,单元格高度需要为 225 点才能满足所有约束。

【讨论】:

您好,很抱歉回复晚了。错误仍然出现。 我没有使用故事板。 UI 是基于代码的。由于我定义的布局约束V:|-12-[imageView(200)]-12-|,单元格高度必须为 224 我不明白为什么首先有一个初始高度?我没有实现- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 我刚刚实现了- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath NSLog(@"Row Height: %f", _tableView.rowHeight); ,以便在绘制 tableView 并记录 -1.0000 后找到一个位置

以上是关于自定义 UITableViewCell 垂直布局约束导致错误的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UITableViewCell 中忽略自动布局

UITableViewCell 布局问题

自动布局问题 - 垂直间距

自定义 UITableViewCell 子视图布局

自动布局忽略 UITableViewCell 内的垂直布局之一

使用自动布局应用与同级视图相同的垂直位置