cocoaAutolayout:内容拥抱VS内容压缩抵抗优先

我无法find关于Cocoa Autolayout关于内容拥抱和压缩阻力之间差异的苹果文档的明确答案。

有人可以解释他们的用法和区别?

概念的快速总结:

  • 拥抱=>内容不想成长
  • 压缩电阻=>内容不想缩小

举个例子:

假设你有这样的button:

[ Click Me ] 

你已经把边缘固定在优先级为500的更大的超级视图上。

那么,如果拥抱优先> 500,它会看起来像这样:

 [Click Me] 

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

 [ Click Me ] 

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

 [Click Me] 

否则,如果压缩阻力优先级<500,它可能是这样的:

 [Cli..] 

如果它不这样工作,那么你可能还有一些其他的限制,这些都是搞砸了你的好工作!

例如,您可以将其固定到优先级为1000的超级视图。或者,您可以使用宽度优先级。 如果是这样,这可能会有所帮助:

编辑器>尺寸以适合内容

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

在这里输入图像描述

假设您有一个带有文字“Click Me”的button。 那个button应该是多宽?

首先,你绝对不希望button比文字小。 否则,文本会被裁剪。 这是水平抗压优先。

其次,你不希望button比需要的大。 看起来像这样的button,[Click Me]显然太大了。 你想要的button“拥抱”其内容,没有太多的填充。 这是拥抱优先的横向内容。 对于一个button来说,它不像水平抗压优先级那么强。

在这里输入图像描述

来源: 克拉肯德夫

内在内容大小 – 非常明了,但是具有可变内容的视图知道内容有多大,并通过此属性描述其内容的大小。 UIImageView,UILabels,UIButtons的一些明显的具有固有内容大小的视图示例。

内容拥抱优先级 – 这个优先级越高,视图越抵抗增长大于其内在内容的大小。

内容压缩阻力优先级 – 这个优先级越高,视图抵抗收缩越小于其内在内容大小。

在这里检查更多的解释: 自动布局魔术:内容大小优先

如果view.intrinsicContentSize.width != NSViewNoIntrinsicMetric ,则自动布局创build一个types为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 ,则自动布局会创build一个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) 

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

 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> 

内容拥抱和内容压缩Resistence Priorities适用于可根据内容进行内在计算的元素。

从Apple文档 :

在这里输入图像描述

Content hugging priority就像放在视图周围的橡皮筋 。 优先级值越高,橡皮筋越强,越想拥抱它的内容尺寸。 优先级值可以想象为橡皮筋的“强度”

Content Compression Resistance是, “抗拒”视图变得越小视图的阻力优先值越高,就是抵抗压缩的视图。