嵌套视图中的拥抱和抗压性

Posted

技术标签:

【中文标题】嵌套视图中的拥抱和抗压性【英文标题】:hugging and compression resistance in nested views 【发布时间】:2015-11-21 11:31:14 【问题描述】:

我试图了解拥抱和抗压的真正作用。

我有这种情况,我需要在左侧(绿色容器内)有两个标签,在右侧(在蓝色容器内)需要两个标签。

如图所示,我希望绿色容器包含内容(androidwrap content),蓝色容器填充剩余空间(Android 的 fill_parent)。

我想我可以在绿色视图中添加拥抱/压缩优先级,例如:

greenView.setContentHuggingPriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal)
greenView.setContentCompressionResistancePriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal)

但它似乎没有按预期工作。我必须将这些约束应用于(红色和黄色)标签。

有人知道原因吗?

一些想法(已编辑):

根据 Ken 的回答,您必须将拥抱/压缩设置为标签而不是容器视图。

在这个问题的示例中,例如,我会在左侧的标签上设置 750(高)的拥抱和 1000(必需)的阻力。由于标签的默认值是拥抱 251(低+1)和阻力 750(高),因此左侧标签的拥抱和压缩会更大(750 > 251 和 1000 > 750)。同时,压缩将大于标签内的拥抱(1000 > 750)。

这样,左侧的标签会尝试拥抱它们的内容,但不会像压缩它那样多。例如,红色标签不能完全包裹其内容,因为黄色标签不想压缩。

呼!

【问题讨论】:

【参考方案1】:

内容拥抱和抗压缩优先级仅对视图的内在内容大小有意义。基本上,如果视图具有固有的内容宽度,那么自动布局系统会将其视为受到以下约束:

[view(<=intrinsicWidth@contentHuggingPriority)]
[view(>=intrinsicWidth@compressionResistancePriority)]

这就是所有这些意思。当然,这同样适用于固有高度。

用作容器的普通UIView 没有固有大小。所以,它的内容拥抱和抗压优先级是没有意义的。

【讨论】:

很好的解释,肯。我还没有在任何地方看到过这样的解释,这完全有道理。是否有任何官方文件证实这一点? 现在我看到这就是official documentation 所说的。但现在我明白了。谢谢! 很高兴能帮上忙。您可能会发现conceptual guide 更有帮助,而不是参考课程参考。 @KenThomases 那么我们如何告诉UIView 取其内容高度的高度,尤其是当涉及到嵌套的UIViews 时?这一定很简单,但我就是不明白:(

以上是关于嵌套视图中的拥抱和抗压性的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局让文本视图占据整个单元格

具有三个 UILabel 的自我调整大小的单元格不起作用

压力测试看图测测你的抗压性

UIStackView 调整我的视图大小

新商城秒杀系统设计

AutoLayout 约束和 UIPopoverPresentationController