Nuova presentazione modale iOS 13: la presentazione del controller non si sposta verso il basso


11

Ho un comportamento strano quando presento UIViewControllers in modo modale in iOS 13. Il nuovo stile di presentazione che ho visto su iOS 13 è simile al seguente:

Il controller della vista di presentazione appare dietro il controller della vista di presentazione. Viene anche spostato verso il basso per imitare uno "stack"

Il controller della vista di presentazione appare dietro il controller della vista di presentazione.  Viene anche spostato verso il basso per imitare uno "stack"

Nel frattempo, presentando i controller di visualizzazione tramite la mia app, continuo a ottenere questo effetto:

Il controller della vista di presentazione non si sposta affatto quando si presenta un nuovo controller di vista

Il controller della vista di presentazione non si sposta affatto quando si presenta un nuovo controller di vista

Uso questo codice per presentare questo controller di visualizzazione:

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

Ecco la mia domanda: mi chiedo perché questo accada e se esiste un modo per presentare i controller di visualizzazione nel normale stile di iOS 13 (con il controller di visualizzazione di presentazione che si sposta indietro).

Grazie in anticipo!


Come test, prova a commentare il controller.modalTransitionStyle = .coverVerticale anche il controller.modalPresentationStyle = .pageSheet(anche se lo stile di presentazione sarebbe necessario se questo codice fosse eseguito anche su un iPad).
rmaddy,

L'ho commentato ma non cambia nulla :(
CentrumGuy

Risposte:


3

Risulta che il problema era la gerarchia del mio controller di visualizzazione. Sono stato in grado di risolverlo rendendo il controller della vista di presentazione il controller della vista principale della mia app. Per prima cosa ho impostato il controller in background come controller della vista principale chiamando

window.rootViewController = self

e poi usando il mio codice precedente

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

Ho presentato il controller di visualizzazione. Grazie a tutti coloro che hanno cercato di aiutare!


Sto avendo lo stesso problema. Dove hai impostato il flag rootViewController? Proprio prima del seguito?
Paweł Zgoda-Ferchmin,

L'ho impostato quando ho presentato il "controller di sfondo". Chiamiamoli controller 1, 2 e 3 per rendere le cose più facili (1 è il più lontano nella parte posteriore, 2 si trova sullo sfondo dietro 3, e 3 è quello nella parte anteriore noto come Controller Tutorial). Attualmente stiamo esaminando il controller 1. Invece di chiamare presente () sul controller 1 per presentare il controller 2, ho appena impostato il controller 2 come controller della vista principale. Questo in sostanza elimina il controller 1 e la nostra finestra ora ha solo il controller 2 nella sua gerarchia. Ora, puoi presentare il controller 3 normalmente chiamando present () sul controller 2.
CentrumGuy

Certo, questo funziona per me ma causa una varietà di problemi diversi come la scomparsa della barra di stato o il taglio delle animazioni durante i successivi, inoltre non penso che sia sicuro. Ci deve essere una soluzione migliore a questo ...
Paweł Zgoda-Ferchmin

Quando si verificano questi problemi? Quando chiami il presente () o quando imposti il ​​controller della vista principale? La barra di stato che scompare potrebbe essere dovuta al fatto che la barra di stato è in testo nero e appare su uno sfondo nero quando si presenta present () causando la fusione con lo sfondo dell'applicazione.
CentrumGuy

1
Ho creato un semplice progetto demo. Puoi vederlo qui: github . Tutta la logica è in Controller1.swift. Fammi sapere se questo aiuta!
CentrumGuy,

1

Penso che il problema possa essere risolto usando vc.modalPresentationStyle = .fullScreense non c'è UINavigationController, altrimenti puoi usare questi codici come segue:

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

perché con iOS 13 questa è una nuova funzionalità che Apple ha modificato lo stile di presentazione predefinito di View Controller in un foglio modale da schermo intero in iOS 12


2
.fullScreen fa sembrare la vecchia presentazione di iOS 12 in cui non puoi vedere il controller dietro di essa. Non è quello che sto cercando.
CentrumGuy

@CentrumGuy, potresti vedere il link " medium.com/better-programming/… ", è stato spiegato in dettaglio.
Apple ha modificato il

1
So che Apple ha cambiato lo stile di presentazione predefinito in iOS 13. Tuttavia, quando presento i controller di visualizzazione nella mia app, il controller di presentazione non si sposta come in qualsiasi altra parte di iOS 13. Puoi vedere la differenza tra il primo e il secondo immagini nel modo in cui il controller della vista di presentazione viene visualizzato dietro il controller della vista più in alto. Voglio che la mia
venga

Sono felice di poterti aiutare!
glotcha,

1

livello di programmazione:

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

Dallo storyboard:

inserisci qui la descrizione dell'immagine

Questo è tutto. Non è necessario giocare con il controller di root o la finestra.

Per riferimento, visita questo articolo .


0

Possiamo cambiarlo nella barra degli strumenti di Inspector. Per raggiungerlo: vai alla quinta sezione dell'Ispettore Tollbar, quindi modifica il campo Presentazione su Schermo intero.


-1

Questa dovrebbe essere l'unica proprietà che devi impostare

presentedViewController.modalPresentationStyle = .automatic

Dettagliato in https://developer.apple.com/videos/play/wwdc2019/224/


L'impostazione su automatico non sembra risolvere questo problema
CentrumGuy

Il controller di visualizzazione dietro il controller di visualizzazione in primo piano è quello che io chiamo "presente". (Quello che puoi vedere dietro il controller)
CentrumGuy

è la radice? puoi controllare window.rootViewController
glotcha
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.