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
是, “抗拒”的视图变得越小视图的阻力优先值越高,就是抵抗压缩的视图。