【问题标题】:When debugging autolayout what is the meaning of the autoresizing mask strings such as h=--& v=-&-?在调试自动布局时,自动调整大小的掩码字符串(例如 h=--& v=-&-)是什么意思?
【发布时间】:2013-01-12 04:02:57
【问题描述】:

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

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

【问题讨论】:

  • 在 10.7.5 上对此进行实验,我发现 NSAMLC 似乎不喜欢任何属性,除了宽度和高度。尝试为左侧或底部创建一个 NSAMLC,它会给你一个例外。我尝试的其他方法是不等式、乘法和加法,但没有任何效果:我无法获得一个用 & 符号描述自身的 NSAMLC。所以,考虑一下我的好奇心。
  • 哇,你走得很深入,很高兴你玩得开心!我已经放弃了。我认为这些知识将有助于我的调试,但实际上并没有。仅当您的布局受到过度约束时才会出现这些错误,即超级视图将其自动调整大小的掩码强加在您(已经)完全约束的布局上,从而变得过度约束。如果您看到这些通常意味着您需要设置 translatesAutoresizingMaskIntoConstraints = NO。
  • 什么错误?您没有在问题中提及任何错误。
  • 请原谅我的俗语;这些不是错误(即 NSErrors),但我只是在调试自动布局时才注意到它们,所以我将它们与“错误”联系起来。 NSAutoresizingMaskLayoutConstraint 似乎是一个未记录的类。

标签: cocoa autolayout


【解决方案1】:

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

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

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

因此,h=&-& 表示您有灵活的左右边距和固定的宽度,v=-&- 表示固定的上下边距和灵活的高度等等。

【讨论】:

  • “v=--&”怎么样?那是固定的顶部间隙、固定的高度、灵活的底部间隙吗?
  • 是的,完全正确。我没有费心列出所有可能的组合:)
【解决方案2】:

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

【讨论】:

  • 不要认为这个问题是指视觉格式。这是关于解释控制台异常
【解决方案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:) — 知道这一点很重要,因为您不需要受到直接超级视图的限制

十六进制值都是 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-06-08
  • 2014-04-29
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2014-10-23
  • 2014-05-22
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多