确定的约束越来越“无法同时满足的约束”

问题描述:

旋转某些视图时的风景,我得到这个日志时:确定的约束越来越“无法同时满足的约束”

无法同时满足的约束。 以下列表中的至少一个约束可能是您不想要的。试试这个:(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上的UIConstraintBasedLayoutDebugging类中的方法也可能有所帮助。

而我什么都不懂。我添加了象征性的UIViewAlertForUnsatisfiableConstraints断点,但内存地址告诉我什么都没有......我怎样才能以一种更可靠的方式找到这个日志所讨论的约束条件?

在此先感谢

+1

http://*.com/questions/25630315/autolayout-unable-to-simultaneously-satisfy-constraints – luk2302

+0

@ luk2302非常感谢 – AppsDev

您可以对约束进行重新排序,以便视图以一致的顺序出现。因此,原文:

<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分。同时,你已经设置了一个约束条件,表示UIView和你的MyApp.LogoHeaderView之间应该没有距离。冲突是一些约束要求在MyApp.LogoHeaderViewUIView之间至少有82 + 54 + 30 == 166点,而另一个约束则表示它们之间有0点。

您是否真的有多个地方在您的用户界面中有MyApp.LogoHeaderView和标签上显示“欢迎来到...”?

+0

感谢您的详细解释。我在隐藏横向时隐藏标签,因此,在隐藏视图时,您是否也应该删除它们的约束? – AppsDev

+0

是的,或者修改约束的'constant'属性,如果达到你想要的。隐藏的视图仍然参与自动布局。 (事实上​​,在引入UILayoutGuide之前,一些自动布局技术通常涉及隐藏的“间隔”视图。)如果您的目标是iOS 9.0+,则应考虑“UIStackView”,其中会自动调整视图隐藏。 –

+0

非常感谢。另一个问题:当设备旋转时,更改约束的正确方法是什么?这就是为什么我得到“无法同时满足约束”错误... – AppsDev

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