CollectionView Cell 中隐藏的 UIView 会破坏自动布局

Hidden UIView in CollectionViewCell brokes autolayout

我有一个带有自动布局约束的 UICollectionViewCell。它按方面工作,但我的应用程序打印了很多关于未满足约束的警告:

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:0x7f9e650c50f0 UILabel:0x7f9e650c10c0'Toz     Kat Elek >30'.top == UIView:0x7f9e650c0fd0.topMargin - 8>",
    "<NSLayoutConstraint:0x7f9e650c51e0 UIView:0x7f9e650c17f0.top == UILabel:0x7f9e650c10c0'Toz     Kat Elek >30'.top + 20>",
    "<NSLayoutConstraint:0x7f9e650c5280 UIView:0x7f9e650c0fd0.bottomMargin == UIView:0x7f9e650c17f0.bottom - 8>",
    "<NSAutoresizingMaskLayoutConstraint:0x7f9e650d8550 h=--& v=--& V:[UIView:0x7f9e650c0fd0(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f9e650c5280 UIView:0x7f9e650c0fd0.bottomMargin == UIView:0x7f9e650c17f0.bottom - 8>

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.

我尝试了很多不同的组合来找出问题的根源。在使用 Debug View Hierarchy 检查我的视图层次结构时,我发现有一个我没有添加的 UIView 并且这个 UIView 导致了警告消息。

那么如何摆脱这些警告信息呢?

更新

这是我的视图层次结构:

我认为问题不在于隐藏视图。 UICollectionViewCell 的内容视图类似于 UITableViewCell。约束冲突似乎是关于 UILabel.

如果你能把你的故事板截图就更好了。

可以从错误中了解发生了什么:您的标签和它下面的 otherView 附加到 mysteryView,标签 8 离开顶部,然后 20 分开 otherView,8 从 otherView 底部到 mysteryView。非常标准。但是,autoresizingMask 将 mysteryView 的高度设置为零。由于它不能同时满足两者,因此它打破了将 otherView 保持在底部的约束。 MysteryView 变为零高度(但显然停留在顶部位置)并且 Label 变为 8,等等,直到 otherView 挂在底部的任何东西上。

由于 mysteryView 附加到您的 UILabel 和 otherView,应该可以找到它 and/or 打破限制。找到获取文本 "Toz Kat Elek >30" 的标签并查看其大小检查器(右侧面板中的标尺图标)。通过-8 找到附加到其顶部 space 的约束。可能不止一个,这将是问题的一部分。双击它,它会在 IB window 左侧的文档大纲中突出显示,约束详细信息将出现在检查器中。

如果您只能找到您期望附加到 UILabel 和其他元素的视图,请检查这些视图。您可能想使用底部的按钮清除所有约束并重新开始。

但是,如果您发现 mysteryView 并且它确实是偷渡者(显然高度为零),请将其删除。附加到您的标签和视图的约束是有效的,因此您可能需要添加新的约束,将顶部和底部附加到真正的顶部和底部超级视图。

您是否尝试过删除 UIView 的底部边距限制?对于您 post 在警告中编辑的内容,它表示正在删除它以从错误中恢复。如果您已经这样做了,您可以 post 视图层次结构但打开约束吗? .

好的,我在这里找到了我的答案:Auto layout constraints issue on iOS7 in UITableViewCell

问题与单元格的隐藏内容视图有关。要消除错误,请在返回 cellForItemAtIndexPath:

中的单元格之前执行以下操作
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask =
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleBottomMargin;