IOS 如何在 UIStackView 中设置权重

How to set weight in UIStackView in IOS

UIStackView 类似于 Android LinearLayout 但我不知道如何为子视图设置权​​重。

假设我有一个垂直 UIStackView 和 3 个 UIImageView。我想为 UIImageView 连续设置权重 3、6、1。我该怎么做?

UIStackView 没有相同的权重概念。它可以使用子视图的 intrinsicContentSize 作为权重,但是设置特定的 intrinsicContentSize 通常需要创建一个子类并且它也用于其他情况(与您熟悉的 android:layout_weight 属性不同,仅由 LinearLayout).

使用

但是由于 UIStackView 通过对其排列的子视图应用约束来工作,您可以通过在子视图的高度之间设置额外的约束来获得权重的效果。 (UIStackView 旨在让您添加自己的约束以通过这种方式调整布局。)

在你的例子中,你想限制顶视图的高度是底视图高度的 3 倍,你想限制中间视图的高度是底视图高度的 6 倍查看。

您可以在故事板中设置比例高度约束,方法是创建等高约束,然后编辑约束的乘数。

在代码中,您可以这样做(在 iOS 9.0 或更高版本上):

NSLayoutConstraint.activateConstraints([
    top.heightAnchor.constraintEqualToAnchor(bottom.heightAnchor, multiplier: 3),
    middle.heightAnchor.constraintEqualToAnchor(bottom.heightAnchor, multiplier: 6),
])

首先,你真的需要堆栈视图吗?直接使用比例高度约束来安排这个会容易得多。

但是,如果您真的想使用堆栈视图,您可以使用堆栈视图执行此操作。秘诀在于所讨论的 "weight" 只是排列视图的 intrinsicContentSize().height。知道了这一点,我就可以很容易地设置一个堆栈视图,该堆栈视图由三个按您要求的比例的图像视图组成:

出于演示目的,这些是同一图像 重复三次:一次高度为 3 倍,一次高度为 6 倍,另一次高度为 1 倍。

我是怎么做到的?我在故事板中分别给三个图像视图 tag 值 300、600 和 100。 (当然,我可以为此使用 IBInspectable 自定义 属性,在现实生活中,我会这样做。)然后我将它们设为我的 UIImageView 子类 MyImageView 的所有实例,其代码如下所示:

class MyImageView: UIImageView {
    override func intrinsicContentSize() -> CGSize {
        print(self.tag)
        return CGSizeMake(CGFloat(self.tag), CGFloat(self.tag))
    }
}

堆栈视图的分布配置为按比例填充。图像视图的内容模式配置为“缩放以填充”。结果:堆栈视图在布置其排列视图时参考了 intrinsicContentSize 方法,因此做了正确的事情。

内在内容大小等完全不涉及。

要设置小数高度,只需设置小数高度:

  1. 修复堆栈视图的高度(比如,整个屏幕)

  2. 放入A、B、C三个视图

  3. 对于A,将堆栈视图的高度限制为0.3

  4. 对于 B,将高度限制为堆栈视图高度的 0.6

将堆栈视图设置为 distribution:Fill。

如果你运行这个强大的iPhone,它会计算出C是“0.1”。

大功告成。