嵌套视图中的拥抱和压缩阻力

时间:2015-11-21 11:31:14

标签: ios autolayout

我试图了解拥抱和抗压力是如何起作用的。

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

enter image description here

如图所示,我希望绿色容器拥抱内容(Android的wrap 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 个答案:

答案 0 :(得分:17)

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

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

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

用作容器的普通UIView没有内在大小。因此,其内容拥抱和压缩阻力优先级毫无意义。