Нова презентація 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? Прямо перед сейвом?
Paweł Zgoda-Ferchmin

Я встановив це, коли я представив "фоновий контролер". Давайте назвемо їх контролерами 1, 2 і 3, щоб полегшити справи (1 - найдальший ззаду, 2 - на задньому, позаду 3, і 3 - той, що знаходиться спереду, як контролер навчального посібника). Зараз ми дивимось на контролер 1. Замість того, щоб викликати присутній () на контролері 1, щоб представити контролер 2, я просто встановив контролер 2 як контролер кореневого перегляду. Це в основному позбавляється від контролера 1, і наше вікно тепер має лише контролер 2 у своїй ієрархії. Тепер ви можете представити контролер 3, звичайно зателефонувавши на присутній () контролер 2.
CentrumGuy

Звичайно, це працює для мене, але спричиняє безліч різних проблем, таких як зникнення рядка статусу або анімація під час розпалу, також я не думаю, що це безпечно. Має бути краще рішення для цього ...
Paweł Zgoda-Ferchmin

Коли виникають ці проблеми? Коли ви зателефонуєте присутнім () або при встановленні контролера кореневого перегляду? Зникаюча смужка стану може бути тому, що рядок стану є чорним текстом і з’являється на чорному тлі, коли присутній () присутній (), що змушує його поєднуватися з фоном програми.
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

Я радий, що міг допомогти!
glotcha

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

Контролер виду за контролером подання переднього плану - це той, кого я називаю "присутній". (Той, кого ви можете побачити за контролером)
CentrumGuy

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