我想他们必须参考支柱和弹簧模型,但我找不到任何提及它们。当您进行NSLog
约束时,它们有时会显示为未记录类的描述字符串NSAutoresizingMaskLayoutConstraint
。我注意到至少 3 种不同的类型:h=---
, h=--&
,h=-&-
水平和垂直版本。
在对受限布局进行调试时,它们经常出现。
我想他们必须参考支柱和弹簧模型,但我找不到任何提及它们。当您进行NSLog
约束时,它们有时会显示为未记录类的描述字符串NSAutoresizingMaskLayoutConstraint
。我注意到至少 3 种不同的类型:h=---
, h=--&
,h=-&-
水平和垂直版本。
在对受限布局进行调试时,它们经常出现。
如果您指定自动调整掩码而不是约束,或者根本不指定任何约束,则视图将具有 NSAutoResizingMaskLayoutConstraint 约束,而不是 NSLayoutConstraints。如果设置translatesAutoresizingMaskIntoConstraints
为NO
,则不会出现这些约束。您不能在单个视图上混合和匹配,否则会出现无法满足的约束错误。
我使用各种自动调整大小掩码组合设置了一个快速测试项目,并且日志记录格式非常简单。
h=
或v=
表示我们正在讨论水平或垂直方向的约束。-
表示固定大小&
表示灵活的大小因此,h=&-&
意味着你有灵活的左右边距和固定的宽度,v=-&-
意味着固定的上下边距和灵活的高度,等等。
如果您观看 WWDC 2012 上有关掌握自动布局的最佳实践的视频,其中有一个部分,演示者提到这是使用 Autoresizing Masks 而不是约束的视图的语法。没有像 NSLayoutConstraint 那样与这些相关的视觉格式。
添加到 jrturton 的答案中,我发现了解约束描述的最佳信息是 Visual Format Language 文档,您需要在代码中创建约束。该语言被记录为一种正式的语法,因此可能需要一分钟来吸收所有内容。
给你一个例子:
<NSLayoutConstraint:0x10ada8a70 H:|-(44)-[UIButton:0x10ac5dc30] (Names: '|':UIView:0x10ac60470)>
这是一个水平方向约束 ( H :) 从父视图 ( | ) 到 UIButton的链接为 44 像素命名的父视图是 UIView ( Names: '|':UIView: ) — 知道这一点很重要,因为您不需要受直接superview的约束
十六进制值都是 UI 元素的有效地址。当您在所有异常上断点并在约束冲突上暂停时,您可以使用 po 地址查看约束的对象。就我而言:
(lldb) po 0x10ac5dc30
<UIButton: 0x10ac5dc30; frame = (44 199; 30 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x10ac5ddf0>>
(lldb) po 0x10ac60470
<UIView: 0x10ac60470; frame = (0 64; 320 504); autoresize = RM+BM; animations = { position=<CABasicAnimation: 0x10ac5ec70>; bounds=<CABasicAnimation: 0x10ac62250>; }; layer = <CALayer: 0x10ac60530>>