我试图了解如何真正地拥抱和抗压。

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

ios - 嵌套 View 中的拥抱和压缩阻力-LMLPHP

如图所示,我希望绿色容器拥抱内容(Android的wrap content),而蓝色容器填充剩余的空间(Android的fill_parent)。

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

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

但似乎无法正常工作。我必须将这些约束应用于(红色和黄色)标签。

有人知道原因吗?

一些想法(已编辑):

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

在此问题的示例中,我将在左边的标签上设置例如750的拥抱(高)和1000的阻力(必需)。由于标签的默认设置为251(低+1)拥抱和750(高)阻力,因此左侧标签的拥抱和压缩效果会更大(750> 251和1000> 750)。同时,压缩程度将大于标签本身的承受力(1000> 750)。

这样,左侧的标签将尝试拥抱其内容,但压缩程度却不及此。例如,红色标签不能完全包装其内容,因为黄色标签不想压缩。

!

最佳答案

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

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

那就是所有的意思。当然,内在高度也是如此。

用作容器的纯UIView没有固有大小。因此,其内容拥抱和抗压缩优先级没有意义。

10-08 06:11