这谈什么布局约束?

时间:2015-09-15 03:08:24

标签: ios xcode swift

我已经阅读了与此类似的所有SO问题,而我已经迷失了。我收到以下错误:

2015-09-14 22:59:40.455 guess-who[60143:9602686] 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:0x7c0f8e30 UIImageView:0x7b6efb60.top == _UILayoutGuide:0x7c0f67a0.top>",
    "<_UILayoutSupportConstraint:0x7c0f8ae0 V:[_UILayoutGuide:0x7c0f67a0(0)]>",
    "<_UILayoutSupportConstraint:0x7c0f0070 _UILayoutGuide:0x7c0f67a0.bottom == UIView:0x7c0f65e0.bottom>",
    "<NSAutoresizingMaskLayoutConstraint:0x7b6f6130 h=--& v=--& UIImageView:0x7b6efb60.midY == + 204>",
    "<NSAutoresizingMaskLayoutConstraint:0x7b6f6160 h=--& v=--& V:[UIImageView:0x7b6efb60(220)]>",
    "<NSLayoutConstraint:0x7b6f6dc0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7c0f65e0(518)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x7b6f6e20 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7c0f65e0]   (Names: '|':UIView:0x7c0effc0 )>"
)

Will attempt to recover by breaking constraint 
<_UILayoutSupportConstraint:0x7c0f0070 _UILayoutGuide:0x7c0f67a0.bottom == UIView:0x7c0f65e0.bottom>

我已经解决了一些我已经成功解决的其他限制因素,但是这个限制让我感到难过。我不知道UILayoutSupportConstraint是什么;文档不是很彻底。我查看了调试器,UIView:0x7c0f65e0似乎引用了我的主视图(虽然它出于某种原因是空白视图的孩子?)。我找不到任何带有0x7c0f67a0的东西,虽然这似乎是指布局指南,说它们的底部必须相等。我不确定可以使用哪些其他工具来解决这个问题。

编辑:

使用View Debugger,我把它缩小到这两个约束中的一个,我不知道它们的来源:

enter image description here

我无法找到其中任何一个设置的位置。我知道每个人的第一个建议是将translatesAutoresizingMaskIntoConstraints设置为false,但这会破坏我的整个布局,我不知道如何解决它。

4 个答案:

答案 0 :(得分:9)

您还可以考虑在视图中添加辅助功能标识符和约束标识符,以使AL日志更加清晰:

constraintVariableName.identifier = “constraintVariableName”;

在InterfaceBuilder中,使用检查器中的identifier属性。

self.loginButton.accessibilityLabel = NSLocalizedString("LoginButtonAccessibilityLabel", @"");

这些id将最终出现在日志中,例如您在上面发布的内容,用UID替换UIView,UIImageView和UIConstraint等内容。

答案 1 :(得分:3)

似乎你已经对与Superview相关的图像视图给出了限制。因此,为了满足您对UILayoutGuide.bottom的约束,您的约束会被破坏。正如您已经添加了更多或不必要的约束,这些都不是必需的。

正在破坏的限制

  1. UILayoutGuide.top = UIView.top
  2. UILayoutGuide.height = 0
  3. UILayoutGuide.bottom = UIView.bottom
  4. UIImageView高度约束
  5. UIImageView Y位置
  6. UIView高度约束
  7. 您已经从顶部给出UIView垂直间距为'0'但缺少底部/高度约束。
  8. 尝试使用高度(220),UIView高度(518)更改 1000到750 优先级为 1000

    您还需要检查底部约束 "<NSAutoresizingMaskLayoutConstraint:0x7b6f6e20 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7c0f65e0] (Names: '|':UIView:0x7c0effc0 )>"

    如果有可能,请在git上附加demo以获得更好的想法。

    希望它有所帮助。

答案 2 :(得分:2)

禁用translatesAutoresizingMaskIntoConstraints会破坏您的布局,因为您的某些堆叠元素没有明确的高度/宽度设置(PlayAgain,cat,frame),并且基于图像内容。

您的示例项目无法开箱即用,因此我无法检查运行时布局。但是,我首先指定这些元素的高度,以便减少自动约束。它看起来像你在运行时改变了很多约束,所以你需要谨慎地改变相互冲突的约束。在开始约束 - 常量摆弄之前,确保布局很开心!

答案 3 :(得分:-4)

使用以下行。它可能对你有帮助。

[view setTranslatesAutoresizingMaskIntoConstraints:NO];