UIStackView可以被约束吗?

问题描述:

我有一个UIScrollView,填补所有的窗口,并包含一个垂直UIStackView这里我想补充UILabels填补所有可用的宽度。UIStackView可以被约束吗?

UIStackView固定在UIScrollView的所有边缘,我期望它填充所有UIScrollView。但它似乎完全忽略了所有的constriants,它只适合它的孩子。为什么会这样?

要说明,如果我添加标签那样:

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约束上不适用)

Result with stackview contraints

且仅当我改变标签contraint使用滚动视图它的工作原理是期望:

textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true 

则如预期的结果: enter image description here

为什么这种行为?有人可以解释为什么在UIStackView的约束,因为我希望不工作?

完整的源代码avaiable at that gist

+0

lujop嗨,'alignAllCenterX'在你的代码没有任何影响。你可以删除它。 – BangOperator

一切都是正确的。它只是你没有指定内容视图的宽度(堆栈视图)。 加入这一行和东西会很好地工作。

scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true; 

注:钢钉滚动视图领先的内容视图后呢,不提供宽度与内容视图。需要单独的宽度约束,否则内容视图的宽度将等于其内在宽度。 链接:https://*.com/a/18341997/1790683

+0

感谢@BangOperator。你有更多关于为什么需要宽度约束的信息?通常固定到边界足以确定宽度,它不是? – lujop

+0

是scrollviews一个有点不同。你可以谷歌uiscrollview与自动布局。我会尽快粘贴相关链接 – BangOperator