Можно ли ограничить UIStackView?

У меня есть 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 не работают так, как я ожидаю?

Полный исходный код доступен по сути


person lujop    schedule 24.11.2016    source источник
comment
Привет, Луджоп, alignAllCenterX не влияет на твой код. Вы можете удалить это.   -  person BangOperator    schedule 25.11.2016


Ответы (1)


Все правильно. Просто вы не указали ширину представления содержимого (представление стека). Добавьте эту строку, и все будет работать отлично.

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

Примечание. Закрепление начального конца представления прокрутки с представлением содержимого не обеспечивает ширину представления содержимого. Требуется отдельное ограничение ширины, в противном случае ширина представления контента будет равна его внутренней ширине. Ссылки: https://stackoverflow.com/a/18341997/1790683

person BangOperator    schedule 25.11.2016
comment
Спасибо @BangOperator. У вас есть дополнительная информация о том, почему необходимо ограничение ширины? Обычно при закреплении к границам достаточно определить ширину, не так ли? - person lujop; 25.11.2016
comment
Да, прокрутки немного разные. Вы можете погуглить uiscrollview с автозапуском. Я скоро вставлю соответствующие ссылки - person BangOperator; 25.11.2016