In primo luogo, discutiamo il caso senza animazione.
Prima di chiamare present
:
- La finestra è una gerarchia di vista, a partire dalla sua
rootViewController
vista.
Dopo aver chiamato present:
- La gerarchia vista esiste ancora senza modifiche.
- Alla finestra viene aggiunta una vista speciale a schermo intero denominata "visualizzazione dimming" (cioè non all'interno della vista di
rootViewController
ma all'interno della finestra (anche la finestra è UIView
). Questa vista è trasparente, attenua la vista presentando controler e blocca l'interazione dell'utente.
- l'(modale) vista presentato del controller viene poi aggiunta anche alla finestra.
ci sono alcune altre viste aggiunte nella tra la finestra e la finestra del controller presentato. Se si accede la tua gerarchia di vista, vedrai le classi denominate _ControllerWrapperView
o qualcosa di simile.Tuttavia, questo è cambiato tra le versioni di iOS e non dovresti fare affidamento sulla vista struttura. Si noti che il controller modale non può mai essere trasparente perché non è una vista secondaria diretta della finestra e i wrapper tra il controller e la finestra non sono trasparenti.
La custodia animata è quasi la stessa. Solo ci sono alcune animazioni fantasiose tra i passaggi.
Modifica 2: La risposta è stata davvero un po 'errata. C'è una grande differenza tra i controller presentati da iPhone e iPad.
Su iPhone, i controller presentati vengono sempre visualizzati a schermo intero ei controller presentati vengono effettivamente rimossi dalla finestra.
Su iPad, se il controller presentato non è a schermo intero (vedere UIModalPresentationStyle
), il controller di presentazione rimane nella finestra.
vostre questioni:
è che media fino a quando la finestra modale è fino presentingViewController.view (self.view nel caso di cui sopra) viene rimosso dalla gerarchia View e presentedViewController.view (myVC.view nel caso di cui sopra) viene aggiunto su UIWindow?
Se il controller è a schermo intero, questa richiesta è vera. In caso contrario, il controller della vista di presentazione rimane lì, ma l'intero contenuto viene sovrapposto ad altre viste (anche se sono semi-trasparenti). Inoltre, ci sono sempre alcune viste tra le viste del controller presentato e di presentazione.
Che cosa succede se myVC.modalPresentationStyle! = UIModalPresentationFullScreen?
Vedere la risposta alla domanda precedente - su iPhone, non ci sarebbero differenze.
iOS rimuove anche tutte le viste da UIWindow tranne PresentationController.view fino a quando non viene visualizzata la finestra di dialogo modale a schermo intero per l'ottimizzazione? Se NO, perché no?
Dai miei test, solo il controller di presentazione viene rimosso dalla gerarchia delle finestre. Questo è probabilmente per ottimizzare le prestazioni del disegno. Questo è l'unico controller che il sistema può rimuovere in sicurezza. La rimozione di qualsiasi altra vista potrebbe causare problemi (ad esempio viste che dovrebbero essere sempre visibili).
Edit: Se si vuole fare un controller trasparente, è possibile:
- Aggiungere la vista direttamente alla visualizzazione della gerarchia (o alla visualizzazione del controller o alla finestra) con un'animazione di transizione (
+[UIView transition...]
)
- Lo stesso ma anche l'aggiunta di un controller figlio al controller.
Che cos'è 'clippingVC'? – rptwsthi