如何在IOS中的UIStackView中设置权重

时间:2015-12-08 16:15:47

标签: ios android-linearlayout uistackview

UIStackView与Android LinearLayout类似,但我无法弄清楚如何为子视图设置权​​重。

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

layout diagram

3 个答案:

答案 0 :(得分: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),
])

答案 1 :(得分:1)

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

但是,如果您真的想使用堆栈视图,可以使用堆栈视图执行此操作。秘诀是所讨论的“重量”只是排列的视图intrinsicContentSize().height。知道了这一点,我可以轻松地设置一个堆栈视图,其中包含您要求的比例的三个图像视图:

enter image description here

为了演示的目的,那些相同的图像重复三次:一个在3x高度,一个在6x高度,一个在1x高度。

我是怎么做到的?我在故事板中分别给出了三个图像视图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方法,从而做正确的事。

答案 2 :(得分:0)

内在内容大小等完全无关。

要设置分数高度,请设置分数高度:

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

  2. 在A,B,C三个视图中放入

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

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

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

如果在功能强大的iPhone上运行此命令,它将发现C为“ 0.1”。

您完成了。