Vantaggi, problemi, esempi di aggiunta di un'altra UIWindow a un'app iOS?


92

Recentemente mi sono chiesto il fatto che un'app iOS ne abbia solo una UIWindow. Non sembra essere un problema crearne un altro UIWindowe posizionarlo sullo schermo.

La mia domanda è un po 'vaga, ma mi interessa:

  • Cosa potrei potenzialmente ottenere con un secondo UIWindowche non può essere fatto in altri modi?
  • Cosa può andare storto quando si utilizzano più UIWindowistanze?
  • Ho visto che le persone usano un secondo UIWindowper visualizzare i popover come le visualizzazioni su iPhone. È un buon modo per farlo? Perché? Perchè no?
  • Ci sono altri esempi in cui ha perfettamente senso averne un altro UIWindow?

Non è che mi manchi qualcosa. Non ho mai sentito il bisogno di creare un'altra UIWindowistanza ma forse mi permetterebbe di fare cose incredibili di cui non sono a conoscenza! :-)

Spero che possa aiutarmi a risolvere questo problema: ho bisogno di aggiungere una "vista di copertina" su ciò che è attualmente visualizzato. Dovrebbe funzionare anche se sono già presenti uno o più controller modali. Se aggiungo un UIViewalla visualizzazione del controller di root, i controller modali si trovano in cima, così come i controller popover. Se presento la visualizzazione della copertina in modo modale e c'è già un controller modale, viene coperta solo una parte dello schermo.


Utilizzo di più finestre UI nelle applicazioni iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Risposte:


26

A UIWindowpuò fluttuare sopra altri elementi dell'interfaccia utente come la tastiera di sistema.

Per affrontare il tuo ultimo paragrafo: crea un UIWindowcon la stessa cornice della finestra principale. Imposta la sua windowLevelproprietà su UIWindowLevelStatusBar. Imposta la sua hiddenproprietà su NO.


Err, va bene. Grazie. Sapevo che. Puoi entrare un po 'nei dettagli riguardo alle mie domande? Sai come ottenere RID di un secondo UIWindow che è stato aggiunto da makeKeyAndVisible?
Krumelur

Imposta la proprietà nascosta della seconda UIWindow su YES.
Rob Mayoff

Grazie. E mostro la finestra rendendola chiave e visibile? E lo nascondo rendendo visibile UN'ALTRA finestra e smaltendo semplicemente l'altra? Come posso animare una UIWindow come fa UIActionSheet?
Krumelur

Stai attento con questo. Se in! = UIWindowLevelNormal, la tastiera verrà visualizzata sotto di essa su iOS7.
Shawn

108

Partendo dalla risposta di Rob, ho giocato un po 'e vorrei scrivere alcune note per altri che cercano di ottenere informazioni su questo argomento:

  • Non è affatto un problema aggiungerne un altro UIWindow. Creane uno e makeKeyAndVisible. Fatto.
  • Rimuovilo rendendo visibile un'altra finestra, quindi rilascia quella che non ti serve più.
  • La finestra che è "chiave" riceve tutti gli input da tastiera.
  • UIWindow copre tutto, anche modali, popover, ecc. Fantastico!
  • UIWindowè sempre ritratto implicitamente. Non ruota. Dovrai aggiungere un controller come controller di root della nuova finestra e lasciare che gestisca la rotazione. (Proprio come la finestra principale)
  • Il livello della finestra determina quanto "alto" viene visualizzato. Impostalo UIWindowLevelStatusBarin modo che copra tutto. Imposta la sua hiddenproprietà su NO.
  • Un secondo UIWindowpuò essere utilizzato per portare sullo schermo visualizzazioni che galleggiano sopra ogni cosa. Senza creare un controller fittizio solo per incorporarlo in un file UIPopoverController.
  • Può essere particolarmente utile su iPhone dove non è presente un controller popover ma dove potresti voler imitare qualcosa di simile.
  • E sì, ha risolto ovviamente il mio problema: se l'app rinuncia all'attivazione, aggiungi una finestra di copertura su ciò che è attualmente mostrato per impedire a iOS di acquisire uno screenshot del contenuto corrente della tua app.

Non avrei avuto il coraggio di usare un'altra UIWindow se non fosse stato per la tua risposta. Questo è stato anche estremamente utile perché la seconda UIWindow non ruotava automaticamente da sola.
Dan Abramov,

1
Post molto illuminante. Ma cosa succede se rinunci a questa finestra e rendi visibile la chiave della finestra sottostante e il rootViewController di questa finestra sottostante ha un controller modale attualmente presentato? Presenterà nuovamente il controller di visualizzazione modale? Quello che succede nella nostra applicazione è che rootViewController è presentato non quello modale ...
Nava Carmon

@Krumelur Questo va bene. Ho un dubbio. Diciamo che la seconda finestra dell'interfaccia utente viene visualizzata sopra tutte le visualizzazioni correnti. Quando l'utente fa clic su un pulsante sulla visualizzazione che si trova nella prima finestra dell'interfaccia utente che presenta un altro viewcontroller. Questa seconda finestra dell'interfaccia utente si nasconderebbe. Come fare in modo che questa UIWindow venga visualizzata sempre in tutta l'app.
Easwaramoorthy K

1
Uso sempre UIWindow per implementare visualizzazioni di avvisi con stili personalizzati e popover di iPhone. Aiuta sempre a rendere la vista a schermo intero, contenente una vista a schermo intero e incorporando un altro "contenuto" -visualizza all'interno in modo che la vista esterna catturi qualsiasi evento di tocco (e così posso aggiungere una bella ombra e oscurare il mio altro contenuto ^^)
Martin Ullrich

3
Va notato che una seconda finestra non viene mantenuta solo per essere visibile (a differenza delle viste regolari che vengono mantenute dalla loro superview).
Rivera

0

Ecco la documentazione di Apple per una migliore comprensione di UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Un motivo valido, anche se specifico, per utilizzare più istanze di UIWindow è quando è necessario registrare video la schermata dell'app. Potresti non voler includere alcuni elementi (pulsante di registrazione, stato di registrazione, ecc.) Nel video registrato finale, quindi puoi inserire questi elementi in una finestra dell'interfaccia utente separata in alto.

In realtà, se si utilizza ReplayKit, è necessario utilizzare un UIWindow separata per questi elementi dell'interfaccia utente escluse. Maggiori informazioni qui: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

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.