感谢http://useYourLoaf.com这个完整的解决方案:
快速的提示,我发现了埋在自动布局一个WWDC 2015年会议的调试与约束问题的时候,可以帮助
如果您使用自动布局时,您会熟悉Xcode在出现问题时吐出的日志。为了创建一个示例,我修改了my Stack View sample code并为每个图像添加了一个约束,使它们具有240的固定宽度(我们将会看到这不是一个好主意)。
,在普通宽度的观点,如iPad的作品,但太宽了一个紧凑的宽度视图,如iPhone的肖像。运行时的控制台日志阅读起来并不好玩。跳过重复的文字你的问题的约束列表:
"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-| (Names: '|':UIStackView:0x7fc1ab531a10)>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"
然后,日志会告诉你这上面的约束已经决定分手:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>
日志输出采用了自动布局视觉格式语言,但很难从系统创建的那些中挑选出我的约束。堆栈视图的情况尤其如此,其设计意图是为您创建大部分约束条件。在这个微不足道的例子中,我知道我刚刚添加的固定宽度约束破坏了事情,但很难从日志中看到更复杂的视图,它越难获得。
添加标识符的约束
日志变得轻松了很多,如果你添加一个标识符每个约束理解(NSLayoutConstraint
以来的iOS 7已经有一个标识属性)。在Interface Builder中找到的约束,并在属性检查器中添加的标识符(我使用$作为前缀/后缀,使他们脱颖而出,在日志中):
更新18月 - 2015年:正如在注释中指出的那样,标识符只能在Xcode 7开始的Interface Builder中编辑。它在Xcode 6.4中不可见。
如果添加约束代码:
constraint.identifier = "$HeartImageFixedWidth$"
这是棘手的,如果你正在使用的使用约束的阵列视觉格式的语言。例如,考虑银行代码片段来创建一个固定的宽度约束对心脏图像视图:
let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]",
options:[], metrics:nil, views:viewsDictionary)
由于heartWidth是式[NSLayoutConstraint]的阵列设置标识符是更多一点的工作:
for constraint in heartWidth {
constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)
随着我的限制,现在更容易找到他们在日志文件中设置标识(见第4行):
"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-| (Names: '|':UIStackView:0x7f92a30472b0)>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"
还多CLE arer其约束的系统选择了突破:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>
添加标识符来限制也不是没有努力,但它必须通过复杂的布局的调试日志进行排序下一次还清。
进一步阅读
你如何设置这个观点 - 在代码中,IB还是两者的结合?你可以更新你的问题,包括? – jrturton
可能的重复[获取奇怪的错误谈论约束在Xcode](http://stackoverflow.com/questions/11664115/getting-weird-error-talking-about-constraints-in-xcode) –
关于约束问题的答案已清除是在这里:[无法同时满足约束,将尝试通过打破约束恢复](http://stackoverflow.com/q/11664115/2725435) –