无法满足约束时如何识别调试区域中的视图?
Posted
技术标签:
【中文标题】无法满足约束时如何识别调试区域中的视图?【英文标题】:How to identify views in Debug area when unsatisfiable constraints? 【发布时间】:2016-03-27 21:50:11 【问题描述】:我正在使用Autolayout
并以编程方式设置约束,并且在运行应用程序时遇到了一些无法满足约束的错误,例如:
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x798cd1c0 H:[UIImageView:0x78e03c20(40)]>
我有几个像这样的UIImageView
,我发现很难知道是哪一个使该约束被打破。无论如何要设置视图的名称标签,以便在调试区域更好地识别它们?
【问题讨论】:
【参考方案1】:Xcode 的自动布局提供了一个函数来将标识符设置为约束。使用此功能很容易找到不需要的约束。
要将标识符设置为约束,只需在情节提要上选择约束,您将在尺寸检查器中弹出所选约束属性的提示,如下所示,
出于演示目的,我设计了一个屏幕,其中三个图像视图垂直对齐,如下所示,
我已将每个 imageView 的固定宽度设置为 240 pts,并将LeadingSpace 和 TrailingSpace 设置为 40 pts,因此这会在这两个约束之间产生冲突。在将标识符设置为约束之前查看打破约束的日志,
"NSLayoutConstraint:0x7fbce9cb9180 H:[UIImageView:0x7fbce9cbb8c0(240)]>",
"<NSLayoutConstraint:0x7fbce9cbe450 H:[UIImageView:0x7fbce9cbb8c0]-(40)-| (Names: '|':UIView:0x7fbce9cb6320 )",
"NSLayoutConstraint:0x7fbce9cbe4a0 H:|-(40)-[UIImageView:0x7fbce9cbb8c0] (Names: '|':UIView:0x7fbce9cb6320 )",
"NSLayoutConstraint:0x7fbce9c29b30 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fbce9cb6320(375)]"
设置标识符后,
"NSLayoutConstraint:0x7ff7da44ba70
H:[UIImageView:0x7ff7da448ba0]-(40)-| (Names:
'|':UIView:0x7ff7da448750 )",
"NSLayoutConstraint:0x7ff7da44bac0 H:|-(40)-[UIImageView:0x7ff7da448ba0] (Names:
'|':UIView:0x7ff7da448750 )",
"NSLayoutConstraint:0x7ff7da447d30 'RedImageViewWidth' H:[UIImageView:0x7ff7da448ba0(240)]",
"NSLayoutConstraint:0x7ff7da4206a0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7ff7da448750(375)]"
读取约束中断日志的诀窍是读取数字,在上面您可以看到数字为“240”、“40”和“375”,并尝试找到具有相同常量值的约束在故事板上,
在我的情况下,日志消息表明,SuperView 的前导和尾随空间为 40 pts,同时宽度为 240 pts,因此自动布局打破了此宽度约束并将 375 pts 的宽度设置为根据屏幕尺寸,前导和尾随空间为 40 点。
希望这会对您有所帮助。
【讨论】:
以上是关于无法满足约束时如何识别调试区域中的视图?的主要内容,如果未能解决你的问题,请参考以下文章
当 AutoLayout 在调试控制台中记录无法满足的约束时,如何使我的应用程序崩溃?