У меня есть UIScrollView
, который заполняет все окно и содержит вертикальный 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
не работают так, как я ожидаю?
Полный исходный код доступен по сути
alignAllCenterX
не влияет на твой код. Вы можете удалить это. - person BangOperator   schedule 25.11.2016