Возможно ли иметь ContainerView, размер которого соответствует его размеру Sub-Stackview? - PullRequest
0 голосов
/ 14 февраля 2020

Я хотел бы сохранить мой код модульным, поэтому у меня есть ContainerView, который указывает на sub viewController. Я хочу, чтобы размер ContainerView изменялся в зависимости от размера представления в субконтроллере enter image description here В более простом случае, на рисунке выше, если я использую StackView, я могу получить родительский фиолетовый вид для изменить размер, если один из дочерних стековых представлений скрыт или оба.

Я хочу, чтобы то же самое происходило с представлением контейнера (показано серым представлением на рисунке), где, если размер изменяемого представления стека изменяется, родительский контейнер Размеры просмотра. У меня есть равные ограничения по высоте на containerView. Тем не менее, это не похоже на работу, и я не уверен, что это возможно. Я хочу, чтобы он изменил размер, потому что он блокирует клики к основному виду.

Я считаю, что это похоже, но достаточно отличается от этого вопроса, так как мы говорим о представлениях стека., Child ViewController для изменения размера containerView

1 Ответ

1 голос
/ 14 февраля 2020

Да, это возможно.

1 - присвойте своим UIContainerView верхним, ведущим и конечным ограничениям

2 - присвойте своему UIContainerView ограничение по высоте с Priority: Low (250) .. ... это будет "переопределено" новым ограничением, добавленным через код.

3 - Настройте свой дочерний контроллер представления как требуется ... в этом простом случае ограничьте представление стека всеми 4 сторонами

4 - Когда дочернее представление было загружено, установите .translatesAutoresizingMaskIntoConstraints = false на его .view, а затем добавьте ограничения на все 4 стороны в представление контейнера

Если вы правильно настроили все ограничения, Высота представления контейнера будет определяться его подпредставлением (представление дочернего элемента V C).

Пример кода:

class AutoSizeContainerViewController: UIViewController {

    @IBOutlet var theContainerView: UIView!

    // so we can reference the embedded VC
    var subVC: SubViewController?

    // this executes before viewDidLoad()
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? SubViewController {
            self.subVC = vc
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // make sure subVC was set correctly
        if let vc = self.subVC {
            // constrain child VC's view to container view
            vc.view.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                vc.view.topAnchor.constraint(equalTo: theContainerView.topAnchor),
                vc.view.leadingAnchor.constraint(equalTo: theContainerView.leadingAnchor),
                vc.view.trailingAnchor.constraint(equalTo: theContainerView.trailingAnchor),

                // this will keep the container view's bottom equal to the child VC's view content
                theContainerView.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor, constant: 0.0),
            ])
        }

    }

}

Я разместил полный пример проекта здесь: https://github.com/DonMag/AutosizeContainer

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