Вложенный дочерний элемент UIStackView в UIScrollView не растягивается для заполнения - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть UIStackView.

Я добавил несколько просмотров.

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

Это работает.

    let topView = UIView(frame: .zero)
        topView.withSize(.init(width: 0, height: 100))
        topView.backgroundColor = .lightGray

        let spacerView = UIView(frame: .zero)
        spacerView.backgroundColor = .darkGray

        let bottomView = UIView(frame: .zero)
        bottomView.withSize(.init(width: 0, height: 200))
        bottomView.backgroundColor = .lightGray

        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.alignment = .fill
        stackView.spacing = 0
        stackView.distribution = .fill

        addSubview(stackView)

        stackView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            stackView.leadingAnchor.constraint(equalTo: leadingAnchor),
            stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
            stackView.topAnchor.constraint(equalTo: topAnchor),
            stackView.bottomAnchor.constraint(equalTo: bottomAnchor),
        ])

        [topView, spacerView, bottomView].forEach { stackView.addArrangedSubview($0) }

enter image description here

Однако у меня есть сценарий, в котором размер экрана может быть меньше размера просмотров.

Я пытаюсьвставьте мой UIStackView в UIScrollView, однако, когда я это делаю, вид распорки больше не растягивается. Как будто высота теперь равна нулю. (Я добавил интервал, чтобы показать вид сверху и снизу)


        let topView = UIView(frame: .zero)
        topView.withSize(.init(width: 0, height: 100))
        topView.backgroundColor = .lightGray

        let spacerView = UIView(frame: .zero)
        spacerView.backgroundColor = .darkGray

        let bottomView = UIView(frame: .zero)
        bottomView.withSize(.init(width: 0, height: 200))
        bottomView.backgroundColor = .lightGray


        let scrollView = UIScrollView(frame: .zero)
        addSubviews(scrollView)

        NSLayoutConstraint.activate([
            scrollView.leadingAnchor.constraint(equalTo: leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: trailingAnchor),
            scrollView.topAnchor.constraint(equalTo: topAnchor),
            scrollView.bottomAnchor.constraint(equalTo: bottomAnchor)
        ])

        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.alignment = .fill
        stackView.spacing = 8
        stackView.distribution = .fill
        scrollView.addSubview(stackView)

        stackView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            // Attaching the content's edges to the scroll view's edges
            stackView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
            stackView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor),
            stackView.topAnchor.constraint(equalTo: scrollView.topAnchor),
            stackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),

            // Satisfying size constraints
            stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
        ])

        [topView, spacerView, bottomView].forEach { stackView.addArrangedSubview($0) }

enter image description here

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

1 Ответ

0 голосов
/ 10 ноября 2019

Использование UITableView с UICollectionView в качестве нижнего колонтитула.

Учебное пособие можно найти здесь: https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell-in-swift/

Это для добавления collectionView в качестве верхнего колонтитула, но работает то же самое для нижнего колонтитула.

private let tableView: UITableView = {
    let view = UITableView(frame: .zero, style: .plain)
    view.translatesAutoresizingMaskIntoConstraints = false
    view.estimatedRowHeight = 44
    view.rowHeight = UITableView.automaticDimension
    view.keyboardDismissMode = .interactive
    view.tableFooterView = //Your Custom View with CollectionView here
    return view
}()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...