Новая модальная презентация iOS 13: представление контроллера не движется вниз


11

У меня странное поведение при модальном представлении UIViewControllers в iOS 13. Новый стиль представления, который я видел во всей iOS 13, выглядит следующим образом:

Контроллер представления представлен позади представленного контроллера представления. Это также сдвинуто вниз, чтобы подражать "стеку"

Контроллер представления представлен позади представленного контроллера представления.  Это также сдвинуто вниз, чтобы подражать "стеку"

Между тем, представляя контроллеры представления через мое приложение, я продолжаю получать этот эффект:

Контроллер представления не перемещается вообще при представлении нового контроллера представления

Контроллер представления не перемещается вообще при представлении нового контроллера представления

Я использую этот код для представления этого контроллера представления:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Вот мой вопрос: мне интересно, почему это происходит, и есть ли способ представить контроллеры представления в обычном стиле iOS 13 (с возвращением контроллера представления назад).

Заранее спасибо!


В качестве теста попробуйте закомментировать controller.modalTransitionStyle = .coverVerticalи даже controller.modalPresentationStyle = .pageSheet(хотя стиль представления будет необходим, если этот код также выполняется на iPad).
rmaddy

Я закомментировал это, но это ничего не меняет :(
CentrumGuy

Ответы:


3

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

window.rootViewController = self

а затем используя мой предыдущий код

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Я представил вид контроллера. Спасибо всем, кто пытался помочь!


У меня такая же проблема. Где вы установили флаг rootViewController? Прямо перед началом сеанса?
Павел Згода-Ферхмин

Я установил его, когда представил «контроллер фона». Давайте назовем их контроллерами 1, 2 и 3, чтобы упростить задачу (1 - самый дальний сзади, 2 - сзади 3, а 3 - спереди, то есть Tutorial Controller). В настоящее время мы смотрим на контроллер 1. Вместо вызова функции present () на контроллере 1 для представления контроллера 2, я просто устанавливаю контроллер 2 в качестве контроллера корневого представления. Это в основном избавляет от контроллера 1, и наше окно теперь имеет только контроллер 2 в своей иерархии. Теперь вы можете нормально представить контроллер 3, вызвав present () на контроллере 2.
CentrumGuy

Конечно, это работает для меня, но вызывает различные проблемы, такие как исчезновение строки состояния или обрезка анимации во время перехода, также я не думаю, что это безопасно. Должно быть лучшее решение для этого ...
Павел Згода-Ферхмин

Когда возникают эти проблемы? Когда вы вызываете present () или когда вы устанавливаете контроллер корневого представления? Исчезающая строка состояния может быть вызвана тем, что строка состояния отображается черным текстом и появляется на черном фоне, когда происходит present (), что приводит к ее смешению с фоном приложения.
CentrumGuy

1
Я создал простой демонстрационный проект. Вы можете посмотреть на это здесь: github . Вся логика в Controller1.swift. Позвольте мне знать, если это помогает!
CentrumGuy

1

Я думаю, что проблема может быть решена с помощью, vc.modalPresentationStyle = .fullScreenесли нет UINavigationController, в противном случае вы можете использовать эти коды следующим образом:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

потому что в iOS 13 это новая функция, благодаря которой Apple изменила стиль представления View Controllers по умолчанию на полноэкранный режим в iOS 12


2
.fullScreen делает его похожим на старую презентацию iOS 12, где вы вообще не можете видеть контроллер за ней. Это не то, что я собираюсь.
CentrumGuy

@CentrumGuy, вы можете увидеть ссылку « medium.com/better-programming/… », это было подробно объяснено.
Apple изменила значение по умолчанию

1
Я знаю, что Apple изменила стиль представления по умолчанию в iOS 13. Однако, когда я представляю свои контроллеры представления в своем приложении, контроллер представления не перемещается, как это происходит везде в iOS 13. Вы можете увидеть разницу между первым и вторым изображения в том виде, в каком контроллер представления представлен за верхним контроллером вида. Я хочу, чтобы мой показывался как первая картинка
CentrumGuy

Я рад, что смог помочь!
Глотча

1

Программный:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

Из раскадровки:

введите описание изображения здесь

Вот и все. Нет необходимости играть с корневым контроллером или окном вообще.

Для справки, посетите эту статью .


0

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


-1

Это должно быть единственное свойство, которое вам нужно установить

presentedViewController.modalPresentationStyle = .automatic

Подробно в https://developer.apple.com/videos/play/wwdc2019/224/


Установка автоматического
режима не устраняет

Контроллер вида за контроллером вида переднего плана - это тот, на котором я называю «настоящее». (Тот, который вы можете увидеть за контроллером)
CentrumGuy

это корень? Вы можете проверить window.rootViewController
glotcha
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.