我在苹果文档中找不到关于Cocoa Autolayout内容拥抱和抗压缩之间差异的明确答案。
有人能解释一下它们的用法和区别吗?
我在苹果文档中找不到关于Cocoa Autolayout内容拥抱和抗压缩之间差异的明确答案。
有人能解释一下它们的用法和区别吗?
当前回答
来源: @mokagio
内在内容大小——这是不言自明的,但具有可变内容的视图会意识到其内容的大小,并通过此属性描述其内容的大小。一些具有固有内容大小的视图的明显例子是UIImageViews, UILabels, UIButtons。
内容拥抱优先级——这个优先级越高,视图就越能抵抗比其固有内容大小更大的增长。
内容抗压缩优先级——该优先级越高,视图越能抵抗缩小到小于其固有内容大小的情况。
查看这里更多的解释:自动布局魔术:内容大小优先级
其他回答
如果view.intrinsicContentSize.width != NSViewNoIntrinsicMetric,那么自动布局会创建一个特殊的NSContentSizeLayoutConstraint类型的约束。这个约束就像两个正常的约束:
需要视图的约束。width <= view.intrinsicContentSize.width具有水平拥抱优先级,和 需要视图的约束。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.intrinsic contentsize .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)
你可以通过打印view看到这些特殊的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>
简要介绍一下这些概念:
拥抱=>内容不想增长 抗压缩性=>内容不想收缩
例子:
假设你有一个这样的按钮:
[ Click Me ]
并且您已经将边缘固定到优先级为500的更大的父视图。
然后,如果拥抱优先级> 500,它将看起来像这样:
[Click Me]
如果拥抱优先级< 500,它会像这样:
[ Click Me ]
如果父视图现在缩小,如果抗压缩优先级为> 500,它会像这样
[Click Me]
否则,如果抗压缩优先级< 500,它可能看起来像这样:
[Cli..]
如果它不像这样工作,那么你可能有其他的限制正在搞砸你的好工作!
例如,你可以把它固定在优先级为1000的父视图上。 或者你可以设置宽度优先级。如果是这样的话,下面的建议会很有帮助:
编辑器>大小适合内容
内容拥抱优先级就像放置在视图周围的橡皮筋。 优先级值越高,橡皮筋越强,它就越想拥抱它的内容大小。 优先级值可以想象成橡皮筋的“强度”
内容压缩阻力是指一个视图“抵抗”变小的程度 阻力优先级值较高的视图将抗压缩。
contentcompressionresistancpriority -当没有足够的空间来适应所有的intrinsicContentSize时,具有最低值的视图将被截断
contentHuggingPriority—当有剩余空间需要填充时,具有最低值的视图将扩展到其intrinsicContentSize之外
来源: @mokagio
内在内容大小——这是不言自明的,但具有可变内容的视图会意识到其内容的大小,并通过此属性描述其内容的大小。一些具有固有内容大小的视图的明显例子是UIImageViews, UILabels, UIButtons。
内容拥抱优先级——这个优先级越高,视图就越能抵抗比其固有内容大小更大的增长。
内容抗压缩优先级——该优先级越高,视图越能抵抗缩小到小于其固有内容大小的情况。
查看这里更多的解释:自动布局魔术:内容大小优先级