UIStackView 可以约束吗?
Can UIStackView be constrained?
我有一个 UIScrollView
填充所有 window 并且包含一个垂直 UIStackView
我想在其中添加 UILabels
填充所有可用宽度。
UIStackView
固定在 UIScrollView
的所有边上,我希望它填满所有 UIScrollView
。但它似乎完全忽略了所有的约束,并且它的尺寸只适合它的孩子。为什么会有这种行为?
为了说明如果我以这种方式添加标签:
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
for _ in 1 ... 20 {
let textLabel = UILabel()
textLabel.backgroundColor = UIColor.yellow
textLabel.text = "Hi World xxxx"
stackView.addArrangedSubview(textLabel)
textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected
}
我得到的是这样的:(青色背景是 UIScrollView
并且您可以看到由于 UIStackView
约束不适用,标签没有占据所有宽度)
并且只有当我将标签约束更改为使用 scrollView 时,它才会按预期工作:
textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
那么结果和预期的一样:
为什么会有这种行为?有人可以解释为什么 UIStackView
上的约束不像我预期的那样起作用吗?
完整的源代码avaiable at that gist
一切正确。只是您没有指定内容视图(堆栈视图)的宽度。
添加这一行,一切都会完美无缺。
scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true;
注意: 固定滚动视图的前导尾随内容视图不会为内容视图提供宽度。需要单独的宽度约束,否则内容视图的宽度将等于其固有宽度。
链接:
我有一个 UIScrollView
填充所有 window 并且包含一个垂直 UIStackView
我想在其中添加 UILabels
填充所有可用宽度。
UIStackView
固定在 UIScrollView
的所有边上,我希望它填满所有 UIScrollView
。但它似乎完全忽略了所有的约束,并且它的尺寸只适合它的孩子。为什么会有这种行为?
为了说明如果我以这种方式添加标签:
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
for _ in 1 ... 20 {
let textLabel = UILabel()
textLabel.backgroundColor = UIColor.yellow
textLabel.text = "Hi World xxxx"
stackView.addArrangedSubview(textLabel)
textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected
}
我得到的是这样的:(青色背景是 UIScrollView
并且您可以看到由于 UIStackView
约束不适用,标签没有占据所有宽度)
并且只有当我将标签约束更改为使用 scrollView 时,它才会按预期工作:
textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
那么结果和预期的一样:
为什么会有这种行为?有人可以解释为什么 UIStackView
上的约束不像我预期的那样起作用吗?
完整的源代码avaiable at that gist
一切正确。只是您没有指定内容视图(堆栈视图)的宽度。 添加这一行,一切都会完美无缺。
scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true;
注意: 固定滚动视图的前导尾随内容视图不会为内容视图提供宽度。需要单独的宽度约束,否则内容视图的宽度将等于其固有宽度。 链接: