Cocoa Autolayout:内容拥抱与内容压缩阻力优先

时间:2013-04-06 11:34:45

标签: cocoa autolayout

关于Cocoa Autolayout关于内容拥抱和抗压缩性之间差异的Apple文档,我无法找到明确的答案。

有人可以解释他们的用法和差异吗?

7 个答案:

答案 0 :(得分:1262)

概念的快速摘要:

  • 拥抱=>内容不想增长
  • 抗压性=>内容不想缩小

和一个例子:

假设您有一个这样的按钮:

[       Click Me      ]

并且你已经将边缘固定到一个优先级为500的更大的超级视图。

然后,如果拥抱优先级> 500它看起来像这样:

[Click Me]

如果拥抱优先级< 500它看起来像这样:

[       Click Me      ]

如果superview现在收缩,那么如果压缩阻力优先级> 500,它看起来像这样

[Click Me]

否则,如果压缩电阻优先级< 500,它可能看起来像这样:

[Cli..]

如果它不能像这样工作,那么你可能会遇到其他一些限制你工作的限制!

E.g。你可以把它固定在superview上,优先级为1000。 或者您可以拥有宽度优先级。如果是这样,这可能会有所帮助:

编辑器&gt;尺寸适合内容

答案 1 :(得分:283)

观看此视频tutorial about Autolayout,他们会仔细解释

enter image description here

答案 2 :(得分:145)

enter image description here

来源:@mokagio

内在内容大小 - 非常不言自明,但具有可变内容的视图会知道其内容有多大,并通过此属性描述其内容的大小。一些具有内在内容大小的视图的明显示例是UIImageViews,UILabels,UIButtons。

内容拥抱优先级 - 此优先级越高,视图抵抗的增长就越大于其内在内容大小。

内容压缩阻力优先级 - 此优先级越高,视图越能阻止收缩小于其固有内容大小。

点击此处查看更多说明:AUTO LAYOUT MAGIC: CONTENT SIZING PRIORITIES

答案 3 :(得分:39)

假设你有一个带有文字的按钮,“点击我”。该按钮的宽度应该是多少?

首先,您绝对不希望按钮小于文本。否则,文本将被剪裁。这是水平压缩电阻的优先级。

其次,您不希望按钮大于它需要的大小。一个看起来像这样的按钮,[Click Me],显然太大了。你希望按钮“拥抱”其内容而不需要太多填充。这是水平内容拥抱优先级。对于按钮,它不如水平压缩阻力优先级强。

答案 4 :(得分:18)

如果view.intrinsicContentSize.width != NSViewNoIntrinsicMetric,则自动布局会创建类型为NSContentSizeLayoutConstraint的特殊约束。此约束的作用类似于两个正常约束:

  • 要求view.width <= view.intrinsicContentSize.width具有水平拥抱优先级的约束,
  • 要求view.width >= view.intrinsicContentSize.width具有水平压缩阻力优先级的约束。

在Swift中,使用iOS 9的新布局锚点,您可以设置如下的等效约束:

let horizontalHugging = view.widthAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)

let horizontalCompression = view.widthAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

同样,如果view.intrinsicContentSize.height != NSViewNoIntrinsicMetric,则自动布局会创建NSContentSizeLayoutConstraint,其作用类似于视图高度的两个约束。在代码中,它们看起来像这样:

let verticalHugging = view.heightAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)

let verticalCompression = view.heightAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

您可以在布局运行后通过打印NSContentSizeLayoutConstraint来查看这些特殊的view.constraints实例(如果存在)。例如:

label.constraints.forEach { print($0) }

// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>

答案 5 :(得分:14)

内容拥抱和内容压缩阻力优先级适用于可以根据内容进行内在计算其大小的元素。

来自Apple docs

enter image description here

答案 6 :(得分:9)

Content hugging priority 就像放在视图周围的 橡皮筋 。 优先级值越高,橡皮筋越强,它想要拥抱的内容越大。 优先级值可以想象为&#34; strength&#34;橡皮筋

Content Compression Resistance 是多少 视图&#34;抵抗&#34;越来越小 具有较高电阻优先级值的视图是抵抗压缩的视图。