【发布时间】:2019-08-21 16:04:28
【问题描述】:
我在一次工作面试中被问到这个问题,我想知道他的意思。
对于任何具有固有内容大小的视图,拥抱和压缩属性的作用是显而易见的。
但是没有内在内容大小的视图呢?他们在那里发挥作用吗?
【问题讨论】:
我在一次工作面试中被问到这个问题,我想知道他的意思。
对于任何具有固有内容大小的视图,拥抱和压缩属性的作用是显而易见的。
但是没有内在内容大小的视图呢?他们在那里发挥作用吗?
【问题讨论】:
有点奇怪的问题,没有额外的上下文。
不过,我想你可以讨论几件事...
某些视图在事后获得内在内容大小。一个UIImageView,例如......没有图像,它没有内在的内容大小。但是一旦你设置了它的.image 属性,它的内在内容大小将是图像的大小。因此,您可能希望根据将发生的情况设置优先级。
您可以提供UIView,例如“占位符”内在内容大小。更改拥抱/压缩优先级将在设计时影响该视图。
在这两种情况下,您将在 Storyboard / IB 设计期间“提前计划”,以便在运行时满足您的需求。
编辑
这是一个(相当长的)示例:
这里我有一个UIView(绿色),其中包含一个设置为Fill / Fill / 8 的UIStackView。堆栈视图包含一个UIImageView (Scale To Fill) 和一个UILabel。图片视图具有NO内在内容大小,而标签具有内在内容大小,基于其内容。
使用我设置的约束,堆栈视图是200 x 240 点。
在运行时,我会将图像设置为猫的200 x 100 png:
我的目标是让图像视图“适合图像”,让标签垂直扩展。
当我通过代码(在运行时)设置.image 时,图像视图“获取”一个固有内容大小(在这种情况下为200 x 100)。图像视图和标签都具有Vertical Content Hugging: 251(默认值),结果如下:
但我希望图像保留其原始纵横比 2:1。首先想到的是将图像视图的内容模式更改为Aspect Fit——但我得到了这个结果:
现在我的图像视图正在“装箱”图像,显示红色背景色。
所以,我更改了图像视图的Vertical Content Hugging: 252(比标签优先级更高)。输出:
现在我有了我想要的运行时输出,但在设计时(在 Storyboard / IB 中工作),什么都没有改变,可能还不清楚会发生什么。
所以,我给图像视图一个 Placeholder 200 x 100 的内在内容大小,我看到了:
因为它是一个占位符,它不会影响运行时输出(如果我将图像设置为200 x 50 图像,它将在运行时为200 x 50),但它更好地反映了我的预期。
当然,还有其他方法可以实现目标,这可能不是理想的方法,但它(希望)提供了一种设置元素拥抱/压缩优先级的方法的想法没有内在内容大小可能有用/需要。
【讨论】: