在获得"无法同时满足约束时识别约束"

时间:2015-11-08 09:09:54

标签: ios autolayout breakpoints nslayoutconstraint

将特定视图旋转到横向时,我会得到此日志:

  

无法同时满足约束条件。       可能至少以下列表中的一个约束是您不想要的约束。试试这个:(1)看看每个约束,并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)

(
"<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]>",
"<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']>",
"<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]>",
"<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]>"

  

将尝试通过违反约束来恢复

<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]>
  

在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。   UIView中列出的UIVonstraintBasedLayoutDebugging类别中的方法也可能有所帮助。

我什么都不懂。我添加了符号UIViewAlertForUnsatisfiableConstraints断点,但内存地址没有告诉我什么......我怎样才能以更加明智的方式找到这个日志所讨论的约束?

提前致谢

2 个答案:

答案 0 :(得分:0)

当你在IB中定义约束时,我认为没有办法获得更多信息。 但是问题是什么?你知道标签和视图。现在,您可以查看此视图​​的约束。 在更糟糕的情况下,删除所有对象并逐个添加它们,并在每次添加下一个项目时运行应用程序。然后你会发现错误。

答案 1 :(得分:0)

您可以重新排序约束,以便视图以一致的顺序显示。所以,原来:

<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]>
<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']>
<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]>
<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]>

变为:

<NSLayoutConstraint:0x17009b580 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(82)-[UILabel:0x14c51ed20'Welcome to...']>
<NSLayoutConstraint:0x17009b3f0 V:[UILabel:0x14c51ed20'Welcome to...'(>=54)]>
<NSLayoutConstraint:0x17009b2b0 V:[UILabel:0x14c51ed20'Welcome to...']-(30)-[UIView:0x14c51e7e0]>

<NSLayoutConstraint:0x170280230 V:[MyApp.LogoHeaderView:0x14c51f3e0]-(0)-[UIView:0x14c51e7e0]>

所以,你在垂直方向上有一个MyApp.LogoHeaderView的实例,其中有82个点,标签上写着“欢迎来......”。该标签大于或等于54点高。然后它与UIView之间有30个点。与此同时,您设置了一个约束条件,即UIViewMyApp.LogoHeaderView之间应该没有距离。冲突是一些约束要求MyApp.LogoHeaderViewUIView之间至少有82 + 54 + 30 == 166点,而另一个约束则表示它们之间有0点。

您的UI中是否有多个地方有MyApp.LogoHeaderView且标签上写着“欢迎光临......”?