当不满足约束时如何识别Debug区域中的视图?

时间:2016-03-27 21:50:11

标签: ios debugging uiview autolayout nslayoutconstraint

我正在使用Autolayout并以编程方式设置约束,并且在运行应用程序时遇到一些不可满足约束的错误,例如:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x798cd1c0 H:[UIImageView:0x78e03c20(40)]>

我有几个这样的UIImageView,我很难知道是哪个约束被打破了。无论如何设置,比方说,为视图命名标签,以便在调试区域更好地识别它们?

1 个答案:

答案 0 :(得分:1)

Xcode的自动布局提供了将标识符设置为约束的功能。使用此功能很容易找到哪个约束不必要的查找。

要将标识符设置为约束,只需在故事板上选择约束,然后在尺寸检查器中弹出选定的约束属性,如下所示:

enter image description here

出于演示目的,我设计了一个屏幕,其中三个imageView垂直对齐,如下所示

enter image description here

我已将每个imageView和LeadingSpace以及TrailingSpace的固定宽度设置为240点,因此这会在这两个约束之间产生冲突。在将标识符设置为约束之前,请参阅中断约束日志

"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)]"

阅读约束中断记录的技巧是读取数字,在上面你可以看到数字为&#39; 240&#39;,&#39; 40&#39;和&#39;&#39;&#39;,并尝试在故事板上找到具有相同常量值的约束,

在我的情况下,日志消息表明,我有40点的前导和尾随空间到SuperView并且同时宽度为240点,因此自动布局打破了这个宽度约束并将宽度设置为375点为根据屏幕尺寸,前导和尾随空间为40分。

希望这会对你有所帮助。