如何捕获自动布局约束冗余

时间:2018-11-21 14:58:10

标签: ios swift autolayout

为了确保我的应用程序的显示在所有尺寸下都正确显示,我显然在自动布局约束下苦苦挣扎。

在我的一个ViewContoller中,有一个UIView(ContainerView),可以通过编程方式调整大小,以保持比例设置,而不管屏幕大小如何。

在ContainerView中,有一个StackView,其中3个UIView均以间距填充。

所有这些视图都已添加到情节提要中。

StackView约束位于CenterX,CenterY和长宽比上 StackView中的UIViews约束仅基于长宽比

在ViewDidLoad上调整ContainerView的大小时,它会触发StackView的重新计算,以再次保持正确的比例。

我设法使它看起来正确,但是当我触发代码以调整StackView的大小和位置时,我在打印窗口中收到以下消息,我无法对其进行解密,或者至少我不知道如何进行更正。

  

[LayoutConstraints]无法   同时满足约束条件。
  可能至少有一个   以下列表中的约束是您不想要的约束。
  尝试这个:         (1)查看每个约束,并尝试找出不存在的约束   期望; (2)找到添加了不必要约束的代码或   约束并修复它。 (       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       “”,       ”   (活动,名称:'|':UIStackView:0x7fe3f9005e20)>“,       ”   (活动)>“,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “ = UIView:0x7fe3f9006b70.bottom(活动)>”,       “”,       “”)

     

将尝试通过打破约束来恢复   

     

在UIViewAlertForUnsatisfiableConstraints处创建符号断点   在调试器中捕获它。中的方法   UIView中列出的UIConstraintBasedLayoutDebugging类别,在    可能也有帮助。 2018-11-21   15:36:38.382957 + 0100 RTS游戏同伴[16230:4711284]   [LayoutConstraints]无法同时满足约束。     以下列表中的约束中至少有一个是   你不要试试这个:(1)查看每个约束并尝试   找出你不期望的东西; (2)找到添加了   不必要的约束或约束并进行修复。 (       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       “”,       ”   (活动,名称:'|':UIStackView:0x7fe3f9005e20)>“,       ”   (活动)>“,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “ = UIView:0x7fe3f9006ed0.bottom(活动)>”,       “”,       “”)

     

将尝试通过打破约束来恢复   

     

在UIViewAlertForUnsatisfiableConstraints处创建符号断点   在调试器中捕获它。中的方法   UIView中列出的UIConstraintBasedLayoutDebugging类别,在    可能也有帮助。 2018-11-21   15:36:38.427959 + 0100 RTS游戏同伴[16230:4711284]   [LayoutConstraints]无法同时满足约束。     以下列表中的约束中至少有一个是   你不要试试这个:(1)查看每个约束并尝试   找出你不期望的东西; (2)找到添加了   不必要的约束或约束并进行修复。 (       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       “”,       ”   (活动)>“,       “”,       “”,       ”   (活动)>“,       ”   (活动)>“,       ”   (活动)>“,       “”,       “”,       “”,       “”,       “”)

     

将尝试通过打破约束来恢复   

     

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

我用来调整StackView大小/位置的代码是对以下内容的扩展:

  • 比较ContainerView和 StackView
  • 根据结果,可以使StackView相同 容器视图的高度或它定义了最大可能的宽度 在满足宽高比限制的容器视图中 StackView的
  • 将顶部,底部,前导和尾随约束应用于 StackView以确保其在Container View中居中

任何帮助将不胜感激...

谢谢!

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。

实际上-编译器告诉我的是,存在自动布局约束相互竞争的问题。 我在给定的布局组成中设置了约束,后来尝试添加更多的约束,因为自动布局不会给我每台设备期望的结果,但是编译器告诉我,并非所有的约束都可以满足,因为有些约束完全不同对于相同的锚点。

我删除了所有约束并逐个测试它们,直到找到正确的约束集。

这听起来似乎微不足道,但这仅仅是关于它。