UIStackView
与Android LinearLayout
类似,但我无法弄清楚如何为子视图设置权重。
假设我有一个垂直的UIStackView
和3个UIImageView
。我想为UIImageView
s连续设置权重3,6,1。我该怎么做?
答案 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
。知道了这一点,我可以轻松地设置一个堆栈视图,其中包含您要求的比例的三个图像视图:
为了演示的目的,那些相同的图像重复三次:一个在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)
内在内容大小等完全无关。
修复堆栈视图的高度(例如整个屏幕)
在A,B,C三个视图中放入
对于A,将高度限制设为堆栈视图高度的0.3
对于B,将高度限制为堆栈视图的高度0.6
将堆栈视图设置为distribution:Fill。
如果在功能强大的iPhone上运行此命令,它将发现C为“ 0.1”。
您完成了。