Nowa prezentacja modalna iOS 13: Kontroler prezentacji nie przesuwa się w dół

11

Dziwnie się zachowuję, prezentując UIViewControllers modalnie w iOS 13. Nowy styl prezentacji, który widziałem w iOS 13, wygląda następująco:

Prezentujący kontroler widoku pojawia się za prezentowanym kontrolerem widoku. Jest również przesunięty w dół, aby naśladować „stos”

Prezentujący kontroler widoku pojawia się za prezentowanym kontrolerem widoku.  Jest również przesunięty w dół, aby naśladować „stos”

Tymczasem, prezentując kontrolery widoku za pośrednictwem mojej aplikacji, ciągle uzyskuję ten efekt:

Prezentujący kontroler widoku w ogóle się nie porusza podczas prezentacji nowego kontrolera widoku

Prezentujący kontroler widoku w ogóle się nie porusza podczas prezentacji nowego kontrolera widoku

Używam tego kodu, aby przedstawić ten kontroler widoku:

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

Oto moje pytanie: Zastanawiam się, dlaczego tak się dzieje i czy istnieje sposób na zaprezentowanie kontrolerów widoku w normalnym stylu iOS 13 (z cofnięciem prezentującego kontrolera widoku).

Z góry dziękuję!

CentrumGuy
źródło
Jako test spróbuj skomentować, controller.modalTransitionStyle = .coverVerticala nawet controller.modalPresentationStyle = .pageSheet(chociaż styl prezentacji byłby potrzebny, jeśli ten kod będzie również uruchamiany na iPadzie).
rmaddy
Skomentowałem to, ale nic to nie zmienia :(
CentrumGuy

Odpowiedzi:

3

Okazuje się, że problemem była moja hierarchia kontrolera widoku. Udało mi się to naprawić, czyniąc kontroler widoku prezentującego głównym kontrolerem widoku mojej aplikacji. Najpierw ustawiłem kontroler tła jako kontroler widoku root, wywołując

window.rootViewController = self

a następnie używając mojego poprzedniego kodu

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

Przedstawiłem kontroler widoku. Dziękujemy wszystkim, którzy próbowali pomóc!

CentrumGuy
źródło
Mam ten sam problem. Gdzie ustawiłeś flagę rootViewController? Tuż przed segue?
Paweł Zgoda-Ferchmin
Ustawiłem go, gdy przedstawiłem „kontroler w tle”. Nazwijmy je kontrolerami 1, 2 i 3, aby ułatwić sobie życie (1 jest najdalej z tyłu, 2 jest w tle za 3, a 3 z przodu, czyli Tutorial Controller). Obecnie patrzymy na kontroler 1. Zamiast wywoływać funkcję present () na kontrolerze 1, aby przedstawić kontroler 2, właśnie ustawiłem kontroler 2 jako kontroler widoku głównego. To w zasadzie pozbywa się kontrolera 1, a nasze okno ma teraz tylko kontroler 2 w swojej hierarchii. Teraz możesz normalnie zaprezentować kontroler 3, wywołując present () na kontrolerze 2.
CentrumGuy
Jasne, to działa dla mnie, ale powoduje wiele różnych problemów, takich jak znikanie paska stanu lub cięcie animacji podczas segue, również nie sądzę, że jest to bezpieczne. Musi być lepsze rozwiązanie tego ...
Paweł Zgoda-Ferchmin
Kiedy występują te problemy? Po wywołaniu metody present () lub ustawieniu kontrolera widoku głównego? Znikający pasek stanu może być spowodowany tym, że pasek stanu ma czarny tekst i pojawia się na czarnym tle, gdy występuje present (), powodując, że wtapia się w tło aplikacji.
CentrumGuy,
1
Stworzyłem prosty projekt demonstracyjny. Możesz na to spojrzeć tutaj: github . Cała logika znajduje się w Controller1.swift. Daj mi znać, jeśli to pomoże!
CentrumGuy,
1

Myślę, że problem można rozwiązać, vc.modalPresentationStyle = .fullScreenjeśli nie ma UINavigationController, w przeciwnym razie możesz użyć tych kodów w następujący sposób:

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

ponieważ w iOS 13 jest to nowa funkcja, która Apple zmieniła domyślny styl prezentacji kontrolerów widoku na arkusz modalny z pełnego ekranu w iOS 12

Apple zmieniło ustawienie domyślne
źródło
2
.fullScreen sprawia, że ​​wygląda jak stara prezentacja iOS 12, w której nie widać w ogóle kontrolera. Nie o to mi chodzi.
CentrumGuy,
@CentrumGuy, możesz zobaczyć link „ medium.com/better-programming/… ”, wyjaśniono to szczegółowo.
Apple zmieniło domyślny
1
Wiem, że Apple zmienił domyślny styl prezentacji w iOS 13. Jednak kiedy prezentuję moje kontrolery widoku w mojej aplikacji, kontroler prezentacji nie porusza się tak jak wszędzie w iOS 13. Możesz spojrzeć na różnicę między pierwszym a drugim zdjęcia w sposób, w jaki prezentujący kontroler widoku jest wyświetlany za najwyższym kontrolerem widoku. Chcę, aby moje wyświetlało się jak pierwsze zdjęcie
CentrumGuy,
Cieszę się że mogłem pomóc!
glotcha
1

Programowo:

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

Z scenorysu:

wprowadź opis zdjęcia tutaj

Otóż ​​to. W ogóle nie trzeba grać z kontrolerem root lub oknem.

W celach informacyjnych odwiedź ten artykuł .

iBug
źródło
0

Możemy to zmienić na pasku narzędzi inspektora. Aby to osiągnąć: przejdź do piątej sekcji Inspektora Tollbar, a następnie zmień pole Prezentacja na Pełny ekran.

Navin Dogiparthi
źródło
-1

To powinna być jedyna właściwość, którą musisz ustawić

presentedViewController.modalPresentationStyle = .automatic

Szczegółowo w https://developer.apple.com/videos/play/wwdc2019/224/

glotcha
źródło
Ustawienie automatycznego nie wydaje się rozwiązać tego problemu
CentrumGuy
Kontroler widoku za kontrolerem widoku na pierwszym planie to ten, który nazywam „obecnym”. (Ten, który można zobaczyć za kontrolerem)
CentrumGuy,
czy to jest root? możesz sprawdzić window.rootViewController
glotcha