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
约束上不适用)
且仅当我改变标签contraint使用滚动视图它的工作原理是期望:
textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
为什么这种行为?有人可以解释为什么在UIStackView
的约束,因为我希望不工作?
完整的源代码avaiable at that gist
一切都是正确的。它只是你没有指定内容视图的宽度(堆栈视图)。 加入这一行和东西会很好地工作。
scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true;
注:钢钉滚动视图领先的内容视图后呢,不提供宽度与内容视图。需要单独的宽度约束,否则内容视图的宽度将等于其内在宽度。 链接:https://stackoverflow.com/a/18341997/1790683
感谢@BangOperator。你有更多关于为什么需要宽度约束的信息?通常固定到边界足以确定宽度,它不是? – lujop
是scrollviews一个有点不同。你可以谷歌uiscrollview与自动布局。我会尽快粘贴相关链接 – BangOperator
lujop嗨,'alignAllCenterX'在你的代码没有任何影响。你可以删除它。 – BangOperator