我在苹果留档上找不到关于Cocoa Autolayout关于内容拥抱和压缩阻力之间区别的明确答案。
有人能解释一下它们的用法和区别吗?
假设您有一个带有文本“Click Me”的按钮。该按钮的宽度应该是多少?
首先,你绝对不希望按钮比文本小。否则,文本会被裁剪。这是水平抗压优先级。
第二,你不希望按钮比它需要的大。一个看起来像这样的按钮,[点击我],显然太大了。你希望按钮“拥抱”它的内容,而不需要太多的填充。这是水平内容拥抱优先级。对于一个按钮来说,它没有水平抗压优先级那么强。
对概念的快速总结:
示例:
假设你有一个这样的按钮:
[ Click Me ]
你已经把边缘固定到一个更大的超级视图,优先级为500。
然后,如果拥抱优先级>500,它看起来像这样:
[Click Me]
如果拥抱优先级<500,它看起来像这样:
如果Superview现在缩小,那么,如果压缩阻力优先级>500,它将看起来像这样
否则,如果压缩阻力优先级<500,它可能看起来像这样:
[Cli..]
如果它不能像这样工作,那么你可能会遇到一些其他的限制,这些限制会破坏你的良好工作!
例如,您可以将其固定到具有1000优先级的超级视图。 或者你可以有一个宽度优先级。如果是这样,这可能会有所帮助:
编辑器>适合内容的大小
看看这个视频关于Autolayout的教程,他们仔细解释了
如果view.intrinsicContentSize.width != NSViewNoIntrinsicMetric,则自动布局会创建一个类型为NSContentSizeLayoutConstraint的特殊约束。此约束的行为类似于两个常规约束:
view.intrinsicContentSize.width != NSViewNoIntrinsicMetric
NSContentSizeLayoutConstraint
view.width <= view.intrinsicContentSize.width
view.width >= view.intrinsicContentSize.width
在Swift中,使用iOS9的新布局锚点,您可以设置等效的约束,如下所示:
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,它就像对视图高度的两个约束。在代码中,它们看起来像这样:
view.intrinsicContentSize.height != NSViewNoIntrinsicMetric
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实例(如果存在)。例子:
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>
内容拥抱和内容压缩抵抗优先级适用于可以根据进来的内容本质上计算其大小的元素。
来自苹果文档:
Content hugging priority就像橡皮筋,放置在视图周围。 优先级值越高,橡皮筋越结实,越想拥抱到自己的内容大小。 优先值可想而知就像橡皮筋的“强度”一样
Content hugging priority
Content Compression Resistance是,查看“电阻”越来越小有多强 具有较高电阻优先级值的视图将抵抗压缩。
Content Compression Resistance
来源:@莫卡吉奥
内在含量大小-非常不言自明,但是具有可变内容的视图知道它们的内容有多大,并通过这个属性描述它们的内容大小。具有内在内容大小的视图的一些明显例子是UIImageViews、UILabels、UIButton。
内容拥抱优先级-这个优先级越高,视图越能抵抗超过其固有内容大小的增长。
内容压缩阻力优先级-此优先级越高,视图越能抵抗收缩到比其固有内容大小小。
查看更多解释:AUTO LAYOUT MAGIC:内容大小优先级
内容抗压优先级-当没有足够的空间来容纳所有内容时,具有最低值的视图会被截断intrinsicContentSize
intrinsicContentSize
内容拥抱优先-当有剩余空间要填充时,具有最低值的视图会扩展到其intrinsicContentSize之外