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

dmi*_*aev 634 cocoa autolayout

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

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

Sno*_*ash 1294

概念的快速摘要:

  • 拥抱=>内容不想增长
  • 压缩阻力=>内容不想缩小

一个例子:

说你有这样的按钮:

[       Click Me      ]
Run Code Online (Sandbox Code Playgroud)

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

然后,如果拥抱优先级> 500,它将如下所示:

[Click Me]
Run Code Online (Sandbox Code Playgroud)

如果拥抱优先级<500,它将如下所示:

[       Click Me      ]
Run Code Online (Sandbox Code Playgroud)

如果superview现在缩小,如果压缩阻力优先级> 500,它将如下所示

[Click Me]
Run Code Online (Sandbox Code Playgroud)

否则,如果压缩电阻优先级<500,它可能如下所示:

[Cli..]
Run Code Online (Sandbox Code Playgroud)

如果它不能像这样工作那么你可能还有一些其他的限制正在弄乱你的好工作!

例如,你可以将它固定到优先级为1000的superview.或者你可以拥有宽度优先级.如果是这样,这可能会有所帮助:

编辑器>适合内容的大小

  • 如果拥抱优先权== 500怎么办? (37认同)
  • @ bradley.ayers对于MaxDesyatov的评论,只有在您具有所需优先级(1000)的冲突约束时才会发生这种情况.如果两个优先级较低的约束冲突,则解决方案不明确,因此Auto Layout引擎将只选择一个有效的解决方案,这就是您将看到的内容(无警告).显然这并不好,因为现在由Auto Layout引擎的内部实现来选择你的布局看起来如何,理论上这可能会从一个iOS版本变为另一个版本! (8认同)

onm*_*133 288

看看这个关于Autolayout的视频教程,他们会仔细解释

在此输入图像描述

  • Hugging vs. Resistance的讨论始于视频中的13:15左右. (31认同)

Bal*_*ian 166

在此输入图像描述

来源:@mokagio

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

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

内容压缩阻力优先级 - 此优先级越高,视图抵抗收缩的程度就越小于其固有内容大小.

点击此处查看更多解释:自动布局魔术:内容大小优先级

  • 独一无二的,这只是透明的;) (8认同)
  • 我这只是因为我喜欢插图而投票. (5认同)
  • 这就是为什么我喜欢Stack Overflow ... Snowcrash的描述加上mokagio的这个插图=这些属性的最佳解释(包括Apple自己的文档). (3认同)

Bri*_*ell 40

假设您有一个带有"Click Me"文本的按钮.该按钮的宽度应该是多少?

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

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


rob*_*off 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)
Run Code Online (Sandbox Code Playgroud)

类似地,如果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)
Run Code Online (Sandbox Code Playgroud)

您可以在布局运行后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>
Run Code Online (Sandbox Code Playgroud)


dev*_* gr 14

内容拥抱和内容压缩阻力优先级适用于可以根据正在进入的内容本质地计算其大小的元素.

来自Apple文档:

在此输入图像描述


Nai*_*hta 9

Content hugging priority是像橡皮筋,其周围放置的图.优先级值越高,橡皮筋越强,它想要拥抱的内容越大.优先级值可以想象为橡皮筋的"强度"

而且Content Compression Resistance,视图"抵抗"变小了多少 具有更高电阻优先级值的视图是抵抗压缩的视图.