没有固有内容大小的UIView的拥抱/压缩?

时间:2019-08-21 16:04:28

标签: ios swift

在求职面试中有人问我这个问题,我想知道他的意思。

对于具有固有内容大小的任何视图,拥抱和压缩属性的作用是显而易见的。

但是没有固有内容大小的视图又如何呢?他们在那里发挥作用吗?

1 个答案:

答案 0 :(得分:1)

奇怪的问题,没有其他上下文。

但是,我想您可以讨论几件事...

  1. 某些视图 get 事后固有的内容大小。例如,UIImageView ...没有图像,则没有固有内容大小。但是,一旦设置了其.image属性,其固有内容大小即为图像的大小。因此,您可能希望根据发生的事件设置优先级。

  2. 您可以提供UIView,例如“占位符”固有内容大小。更改拥抱/压缩优先级 会在设计时影响该视图。

在这两种情况下,您都将在Storyboard / IB设计期间针对运行时的需求进行“预先计划”。


编辑

这是一个(相当长的)示例:

在这里,我有一个UIView(绿色),其中包含一个UIStackView设置为Fill / Fill / 8。堆栈视图包含一个UIImageViewScale To Fill)和一个UILabel。图像视图具有内部内容大小,而标签具有基于其内容的内部内容大小。

enter image description here

根据我设置的约束,堆栈视图为200 x 240点。

在运行时,我将图像设置为猫的200 x 100 png:

enter image description here

我的目标是使图像视图“适合图像”,使标签垂直扩展。

当我通过代码(在运行时)设置.image时,图像视图“获取”固有的内容大小(在这种情况下为200 x 100)。在图像视图和标签都带有Vertical Content Hugging: 251(默认值)的情况下,结果如下:

enter image description here

但是我希望图像保留其原始纵横比2:1。首先想到的是将图像视图的“内容模式”更改为Aspect Fit,但我得到了以下结果:

enter image description here

现在,我的图像视图是将图像“装箱”,显示红色背景颜色。

因此,我更改了图像视图的Vertical Content Hugging: 252(优先级高于标签)。输出:

enter image description here

现在,我有了所需的运行时输出,但是在设计时(在Storyboard / IB中工作),没有任何变化,并且可能还不太清楚会发生什么。

因此,我给图像视图一个 占位符 的内在内容大小为200 x 100,我看到了:

enter image description here

因为它是一个占位符,所以对运行时输出没有影响(如果我将图像设置为200 x 50图像,则它将在运行时为200 x 50 -时间),但它可以更好地反映我的期望。

当然,还有其他方法可以实现目标,但这可能不是理想的方法,但是(希望)提供了一种在元素上设置拥抱/压缩优先级的方法没有内在内容的大小可能是有用/需要的。