11

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

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

布局图

4

3 回答 3

8

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),
])
于 2015-12-08T16:33:50.633 回答
4

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

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

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

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

  3. 对于 A,将高度约束设置为堆栈视图高度的 0.3

  4. 对于 B,将高度约束设置为堆栈视图高度的 0.6

将堆栈视图设置为分布:填充。

如果你在功能强大的 iPhone 上运行它,它会发现 C 是“0.1”。

你完成了。

于 2019-07-26T18:37:02.640 回答
0

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

但是,如果您真的想使用堆栈视图,则可以使用堆栈视图来执行此操作秘密在于,所讨论的“重量”只是排列视图的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方法,从而做正确的事情。

于 2015-12-08T17:08:41.337 回答