Динамическая высота для UIViewController показана как модальное всплывающее окно - PullRequest
0 голосов
/ 05 января 2019

В настоящее время я пытаюсь реализовать пользовательский UIViewController, который имеет UINavigationController внутри. Это модальное представление, которое будет отображаться в нижней части экрана, и у пользователя есть различные варианты навигации внутри этого модального представления. Фон UIViewController установлен на прозрачный, поэтому он отображается как наложение уже видимого экрана.

Мне удалось настроить и представить мой UIViewController следующим образом:

    let modalController = ModalController()
    modalController.modalPresentationStyle = .overCurrentContext
    self.present(modalController, animated: true, completion: nil)

Внутри этого UIViewController Я делаю это:

var popupController: UINavigationController = {
    let popupController = UINavigationController(rootViewController: ModalStart())
    return popupController
}()

var modalPopup: UIView = {
    let modalPopup = UIView()
    modalPopup.translatesAutoresizingMaskIntoConstraints = false
    modalPopup.backgroundColor = .white
    modalPopup.isUserInteractionEnabled = true
    return modalPopup
}()

view.addSubview(modalPopup)
modalPopup.addSubview(popupController.view)

modalPopup.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
modalPopup.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
modalPopup.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
modalPopup.heightAnchor.constraint(equalToConstant: 500).isActive = true

Это работает нормально, но, как вы уже догадались, высота установлена ​​на фиксированную константу 500. Это работает на моем iPhone X, но, например, будет отличаться на iPhone 5s. Это также не позволяет мне соответствующим образом изменять высоту, когда я перемещаюсь по UINavigationController, так как высота другого viewControllers будет отличаться.

Кто-нибудь знает, как мне этого добиться? Я уже добавил пользовательский ContainerView внутри моего rootViewController (ModalStart), но у меня нет прямого доступа к popupController.containerView.frame.height (так как popupController равен UINavigationController). Я также пытался сделать heightAnchor переменной и установить ее в viewDidLayoutSubviews() в ModalStart (), но это тоже не работает и срабатывает постоянно с разной высотой (если я печатаю высоту, иногда возвращается 480, иногда 0, очень странное поведение там).

Мне интересно, как лучше всего подойдет мой конкретный случай. Все, что направляет меня в правильном направлении, очень ценится!

1 Ответ

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

Я покажу вам простой способ сделать это. Из того, что я видел, лучший способ сделать это - использовать модель dataSource для modalView и рассчитать высоту оттуда. Например, если у вас есть изображение и одна метка, высота которой известна, а если нет, то вы не можете рассчитать ее, вы можете отправить ее как источник данных для modalView. Теперь, если следующий modalView будет иметь только 6 меток, снова будет легко рассчитать высоту, которая вам понадобится, чтобы соответствовать им всем. Используя модель dataSource, вы можете предварительно рассчитать всю высоту, прежде чем произойдет переход к следующему modalView. Я собрал для вас простой пример: https://github.com/galots/VariableModal

Если вы нажмете кнопку с надписью Present, будет представлен новый viewController и будет показан modalView с начальным ограничением. Затем, если вы нажмете Далее, высота модального вида будет обновлена ​​в соответствии с источником данных. В этом случае источник данных - это просто массив CGFloat, чтобы его было легко понять. Также обратите внимание, что modalView является подклассом UIView, поэтому вы можете обновить его ограничение высоты по мере необходимости.

Надеюсь, это поможет.

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