UIStackView внутри UIScrollView, увеличивается до максимальной высоты, затем прокручивается - PullRequest
0 голосов
/ 22 января 2019

Я хочу построить представление, которое будет расти по мере добавления к нему подпредставлений. Сначала высота будет равна нулю, затем должна увеличиваться по мере добавления подпредставлений, пока она не достигнет максимального размера, а затем я хочу, чтобы она стала прокручиваемой.

Если я построю это с помощью UIView внутри UIScrollView и установлю ограничения сверху вниз вручную, это будет работать как положено. Тем не менее, я чувствую, что это должно быть возможно с помощью UIStackView, но когда я пытаюсь, либо представление прокрутки не увеличивается, либо contentSize scrollView застревает на максимальной высоте и не будет прокручиваться. Я играл с этим некоторое время и думаю, что это может быть ошибка с UIStackView и Autolayout, но, надеюсь, я что-то пропустил. Упаковка UIStackView в контейнер UIView не помогает.

Вот полный контроллер вида, который показывает проблему (при нажатии в любом месте метки добавляются в вид прокрутки)

import UIKit

class DumbScrollStack: UIViewController {

    let stack = UIStackView()
    let scrollView = UIScrollView()

    override func viewDidLoad() {
        super.viewDidLoad()

        //Setup
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(addLabel)))
        stack.axis = .vertical
        view.backgroundColor = .blue
        scrollView.backgroundColor = .red

        //Add scroll view and setup position
        view.addSubview(scrollView)
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
        scrollView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

        //Set maximum height
        scrollView.heightAnchor.constraint(lessThanOrEqualToConstant: 100).isActive = true

        //add stack
        scrollView.addSubview(stack)
        stack.translatesAutoresizingMaskIntoConstraints = false

        //setup scrollView content size constraints
        stack.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        stack.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
        stack.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true
        stack.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
        stack.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

        // Keep short if stack height is lower than scroll height
        // With this constraint the scrollView grows as expected, but doesn't scroll when it goes over 100px
        // Without this constraint the scrollView is always 100px tall but it does scroll
        let constraint = scrollView.heightAnchor.constraint(equalTo: stack.heightAnchor)
        constraint.priority = UILayoutPriority(rawValue: 999)
        constraint.isActive = true

        addLabel()
    }

    @objc func addLabel() {
        let label = UILabel()
        label.backgroundColor = .gray
        label.text = "Hello"
        stack.addArrangedSubview(label)
    }
}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Добавьте это

label.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 1000), for: .vertical)

или прокомментируйте этот блок

let constraint = scrollView.heightAnchor.constraint(equalTo: stack.heightAnchor)
constraint.priority = UILayoutPriority(rawValue: 999)
constraint.isActive = true

или сделайте его ниже 750 (вертикальное сжатие метки по умолчанию)

constraint.priority = UILayoutPriority(rawValue: 749)

проблема в том, что вертикальный приоритет сжатия метки ниже, чем 999, что всегда делает стек равным высоте прокрутки, следовательно, прокрутки нет

0 голосов
/ 22 января 2019

Рассматривали ли вы использование UICollectionView ? Это похоже на то, что вы пытаетесь восстановить.

Убедитесь, что для «Scrolling Enabled» установлено значение true и установите направление прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...