Объединение двух контейнеров ViewController вместе для заполнения экрана - PullRequest
0 голосов
/ 01 апреля 2020

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

У меня есть следующая настройка в iOS Раскадровке:

enter image description here

Мой основной ViewController имеет два контейнера ViewController, один над другим.

Нижний ViewController предназначен для того, чтобы иметь высоту stati c, определяемую его содержимым. В этом случае он имеет кнопку с верхним, нижним и конечным ограничением. Таким образом, если вы знали высоту кнопки, вы должны иметь возможность определить высоту нижнего ViewController.

Верхний ViewController предназначен для переменной - он имеет кнопку, ограниченную средним центром его родительский вид. Независимо от высоты или ширины родительского вида, внутренняя кнопка всегда будет центрироваться.

Внутри основного ViewController контроллер верхнего вида ограничен верхней и боковыми сторонами основного вида, а контроллер нижнего вида - ограничены основным видом снизу и по бокам. Затем нижняя часть вида сверху и верхняя часть вида снизу связаны друг с другом. Это ломается, потому что iOS пытается определить размер основного вида перед видом снизу (или что-то в этом роде).

Как сделать вид снизу равным высоте его содержимого, и иметь вид сверху заполнить любое оставшееся пространство?

1 Ответ

0 голосов
/ 01 апреля 2020

Вы не можете сделать это с Storyboard only ... вам нужно добавить небольшой код.

Сначала в Storyboard / Interface Builder:

  • ограничить нижний контейнер для просмотра (безопасная область). Leading / Trailing / Bottom
  • присвоить ему ограничение высоты - значение на самом деле не имеет значения, просто что-то, что позволяет вам увидеть приблизительный макет
  • дает ограничение высоты Priority: Low (250). Это позволит ему увеличиваться / уменьшаться в зависимости от размера автоматического макета встроенного представления.
  • ограничивает верхний контейнер для просмотра (безопасная область). Верхний / ведущий / конечный
  • ограничивает Контейнер снизу вверху Контейнер сверху внизу

IB автоматически предоставляет вам контроллеры представления «по умолчанию», когда вы добавляете представления контейнера, устанавливая размер контейнера. Используйте Атрибуты и Размер Панели инспектора, чтобы изменить «Симулированные метрики» и Размер на Freeform. Это позволяет вам работать с «вспомогательными контроллерами представления» в нужных размерах.

Вот пример того, как это может выглядеть:

enter image description here

При встраивании контроллера вида в UIContainerView автоматически создается «embed segue», и вы можете получить ссылку на «подчиненные» контроллеры представления (и их представления) в prepare(for segue: ...). Используйте это, чтобы получить ссылки на представления, чтобы вы могли изменить их ограничения.

Так что ваше viewDidLoad() fun c будет содержать что-то вроде этого:

    // a View Controller's "root" view loads with
    //      .translatesAutoresizingMaskIntoConstraints = true
    // but we want to let auto-layout change it
    topVCView.translatesAutoresizingMaskIntoConstraints = false
    botVCView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([

        // constrain all 4 sides of top view to top container
        //  because the Top container view has a Priority: 1000 height constraint,
        //  this will "fit" the top VC's view into the auto-layout sized top container
        topVCView.topAnchor.constraint(equalTo: topContainerView.topAnchor),
        topVCView.bottomAnchor.constraint(equalTo: topContainerView.bottomAnchor),
        topVCView.leadingAnchor.constraint(equalTo: topContainerView.leadingAnchor),
        topVCView.trailingAnchor.constraint(equalTo: topContainerView.trailingAnchor),

        // constrain all 4 sides of bottom view to bottom container
        //  because the Bottom container view has a Priority: 250 height constraint,
        //  the auto-layout height of the Bottom VC's view will determine the height of the bottom container
        botVCView.topAnchor.constraint(equalTo: bottomContainerView.topAnchor),
        botVCView.bottomAnchor.constraint(equalTo: bottomContainerView.bottomAnchor),
        botVCView.leadingAnchor.constraint(equalTo: bottomContainerView.leadingAnchor),
        botVCView.trailingAnchor.constraint(equalTo: bottomContainerView.trailingAnchor),

    ])

и вот пример того, как это могло бы выглядеть во время выполнения:

enter image description here

Был еще один пример "автоматического определения размера контейнера" ​​на GitHub, поэтому я добавил ваш макет во второй пример. Вы можете получить его здесь, чтобы вы могли изучить макет, ограничения и код (и запустить его, чтобы увидеть результаты): https://github.com/DonMag/AutosizeContainer

...