我在Apple文档中找不到关于Cocoa Autolayout的明确答案,该内容涉及内容拥抱和抗压缩性之间的区别。
有人可以解释他们的用法和区别吗?
content-hugging
:应对空白。这只会迫使视图绕过您。但是,如果您没有太多空间,而是只拥有很小的空间,那么content-compressions-resistance
您将无法显示所有内容而与您的视图抗争,例如,标签将被截断。
我在Apple文档中找不到关于Cocoa Autolayout的明确答案,该内容涉及内容拥抱和抗压缩性之间的区别。
有人可以解释他们的用法和区别吗?
content-hugging
:应对空白。这只会迫使视图绕过您。但是,如果您没有太多空间,而是只拥有很小的空间,那么content-compressions-resistance
您将无法显示所有内容而与您的视图抗争,例如,标签将被截断。
Answers:
概念的简要概述:
例:
假设您有一个这样的按钮:
[ Click Me ]
并且您已将边缘固定到优先级为500的更大的超级视图。
然后,如果“拥抱优先级”> 500,它将如下所示:
[Click Me]
如果拥抱优先级<500,则它将如下所示:
[ Click Me ]
如果现在缩小视图,那么如果“压缩抗性”优先级> 500,它将如下所示
[Click Me]
否则,如果“压缩抗性”优先级<500,则可能是这样的:
[Cli..]
如果这样不起作用,那么您可能还会遇到其他限制,使您的工作陷入混乱!
例如,您可以将其固定到具有优先级1000的超级视图。或者您可以具有宽度优先级。如果是这样,这可能会有所帮助:
编辑器>大小以适合内容
看一下有关Autolayout的视频教程,他们会仔细解释
资料来源:@mokagio
内在内容大小 -很明显,但具有可变内容的视图会知道其内容的大小,并通过此属性描述其内容的大小。具有内在内容大小的视图的一些明显示例是UIImageViews,UILabels,UIButtons。
内容拥抱优先级 -此优先级越高,视图抵抗其自身内容大小增长的能力就越大。
内容压缩抗性优先 -此优先级越高,视图抵抗收缩的能力就小于其固有内容大小。
在此处查看更多说明:自动布局魔术:内容大小优先
如果为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>