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
方法,因此做了正确的事情。
内在内容大小等完全不涉及。
要设置小数高度,只需设置小数高度:
修复堆栈视图的高度(比如,整个屏幕)
放入A、B、C三个视图
对于A,将堆栈视图的高度限制为0.3
对于 B,将高度限制为堆栈视图高度的 0.6
将堆栈视图设置为 distribution:Fill。
如果你运行这个强大的iPhone,它会计算出C是“0.1”。
大功告成。
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
方法,因此做了正确的事情。
内在内容大小等完全不涉及。
要设置小数高度,只需设置小数高度:
修复堆栈视图的高度(比如,整个屏幕)
放入A、B、C三个视图
对于A,将堆栈视图的高度限制为0.3
对于 B,将高度限制为堆栈视图高度的 0.6
将堆栈视图设置为 distribution:Fill。
如果你运行这个强大的iPhone,它会计算出C是“0.1”。
大功告成。