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;

注意: 固定滚动视图的前导尾随内容视图不会为内容视图提供宽度。需要单独的宽度约束,否则内容视图的宽度将等于其固有宽度。 链接: