53

我想他们必须参考支柱和弹簧模型,但我找不到任何提及它们。当您进行NSLog约束时,它们有时会显示为未记录类的描述字符串NSAutoresizingMaskLayoutConstraint。我注意到至少 3 种不同的类型:h=---, h=--&,h=-&-水平和垂直版本。

在对受限布局进行调试时,它们经常出现。

4

3 回答 3

109

如果您指定自动调整掩码而不是约束,或者根本不指定任何约束,则视图将具有 NSAutoResizingMaskLayoutConstraint 约束,而不是 NSLayoutConstraints。如果设置translatesAutoresizingMaskIntoConstraintsNO,则不会出现这些约束。您不能在单个视图上混合和匹配,否则会出现无法满足的约束错误。

我使用各种自动调整大小掩码组合设置了一个快速测试项目,并且日志记录格式非常简单。

  • h=v=表示我们正在讨论水平或垂直方向的约束。
  • -表示固定大小
  • &表示灵活的大小
  • 符号顺序代表边距、尺寸、边距

因此,h=&-&意味着你有灵活的左右边距和固定的宽度,v=-&-意味着固定的上下边距和灵活的高度,等等。

于 2013-01-18T22:56:47.530 回答
3

如果您观看 WWDC 2012 上有关掌握自动布局的最佳实践的视频,其中有一个部分,演示者提到这是使用 Autoresizing Masks 而不是约束的视图的语法。没有像 NSLayoutConstraint 那样与这些相关的视觉格式。

于 2013-01-18T21:49:36.990 回答
3

添加到 jrturton 的答案中,我发现了解约束描述的最佳信息是 Visual Format Language 文档,您需要在代码中创建约束。该语言被记录为一种正式的语法,因此可能需要一分钟来吸收所有内容。

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/VisualFormatLanguage/VisualFormatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1

给你一个例子:

<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>>
于 2014-07-03T13:45:42.043 回答