关于Cocoa Autolayout关于内容拥抱和抗压缩性之间差异的Apple文档,我无法找到明确的答案。
有人可以解释他们的用法和差异吗?
答案 0 :(得分:1262)
概念的快速摘要:
和一个例子:
假设您有一个这样的按钮:
[ Click Me ]
并且你已经将边缘固定到一个优先级为500的更大的超级视图。
然后,如果拥抱优先级> 500它看起来像这样:
[Click Me]
如果拥抱优先级< 500它看起来像这样:
[ Click Me ]
如果superview现在收缩,那么如果压缩阻力优先级> 500,它看起来像这样
[Click Me]
否则,如果压缩电阻优先级< 500,它可能看起来像这样:
[Cli..]
如果它不能像这样工作,那么你可能会遇到其他一些限制你工作的限制!
E.g。你可以把它固定在superview上,优先级为1000。 或者您可以拥有宽度优先级。如果是这样,这可能会有所帮助:
编辑器&gt;尺寸适合内容
答案 1 :(得分:283)
观看此视频tutorial about Autolayout,他们会仔细解释
答案 2 :(得分:145)
来源:@mokagio
内在内容大小 - 非常不言自明,但具有可变内容的视图会知道其内容有多大,并通过此属性描述其内容的大小。一些具有内在内容大小的视图的明显示例是UIImageViews,UILabels,UIButtons。
内容拥抱优先级 - 此优先级越高,视图抵抗的增长就越大于其内在内容大小。
内容压缩阻力优先级 - 此优先级越高,视图越能阻止收缩小于其固有内容大小。
点击此处查看更多说明:AUTO LAYOUT MAGIC: CONTENT SIZING PRIORITIES
答案 3 :(得分:39)
假设你有一个带有文字的按钮,“点击我”。该按钮的宽度应该是多少?
首先,您绝对不希望按钮小于文本。否则,文本将被剪裁。这是水平压缩电阻的优先级。
其次,您不希望按钮大于它需要的大小。一个看起来像这样的按钮,[Click Me],显然太大了。你希望按钮“拥抱”其内容而不需要太多填充。这是水平内容拥抱优先级。对于按钮,它不如水平压缩阻力优先级强。
答案 4 :(得分: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)
同样,如果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)
您可以在布局运行后通过打印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>
答案 5 :(得分:14)
答案 6 :(得分:9)
Content hugging priority
就像放在视图周围的 橡皮筋 。
优先级值越高,橡皮筋越强,它想要拥抱的内容越大。
优先级值可以想象为&#34; strength&#34;橡皮筋
Content Compression Resistance
是多少 视图&#34;抵抗&#34;越来越小
具有较高电阻优先级值的视图是抵抗压缩的视图。