【问题标题】:Hugging/compression for UIViews without intrinsic content size?没有内在内容大小的 UIView 的拥抱/压缩?
【发布时间】:2019-08-21 16:04:28
【问题描述】:

我在一次工作面试中被问到这个问题,我想知道他的意思。

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

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    有点奇怪的问题,没有额外的上下文。

    不过,我想你可以讨论几件事...

    1. 某些视图在事后获得内在内容大小。一个UIImageView,例如......没有图像,它没有内在的内容大小。但是一旦你设置了它的.image 属性,它的内在内容大小将是图像的大小。因此,您可能希望根据将发生的情况设置优先级。

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

    在这两种情况下,您将在 Storyboard / IB 设计期间“提前计划”,以便在运行时满足您的需求。


    编辑

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

    这里我有一个UIView(绿色),其中包含一个设置为Fill / Fill / 8UIStackView。堆栈视图包含一个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),但它更好地反映了我的预期。

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

    【讨论】:

    • 感谢您的回复。 “设计时”是什么意思?你指的是@IBDesignable在IB中的预览吗?
    • @aneuryzm - 请参阅我编辑的答案以获取示例。同样,这是一个有点奇怪的问题,但现在可能更清楚了。
    猜你喜欢
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多