Vorteile, Probleme, Beispiele für das Hinzufügen eines weiteren UIWindow zu einer iOS-App?

92

Kürzlich habe ich mich gefragt, dass eine iOS-App nur eine hat UIWindow. Es scheint kein Problem zu sein, ein anderes zu erstellen UIWindowund es auf dem Bildschirm zu platzieren.

Meine Frage ist etwas vage, aber ich interessiere mich für:

  • Was könnte ich möglicherweise mit einer Sekunde erreichen UIWindow, die auf andere Weise nicht möglich ist?
  • Was kann bei Verwendung mehrerer UIWindowInstanzen schief gehen ?
  • Ich habe gesehen, dass Leute eine zweite verwenden UIWindow, um Popover-ähnliche Ansichten auf dem iPhone anzuzeigen. Ist das ein guter Weg, es zu tun? Warum? Warum nicht?
  • Gibt es andere Beispiele, bei denen es durchaus Sinn macht, ein anderes zu haben UIWindow?

Es ist nicht so, dass mir etwas fehlt. Ich hatte nie das Bedürfnis, eine andere UIWindowInstanz zu erstellen, aber vielleicht würde es mir erlauben, erstaunliche Dinge zu tun, die mir nicht bewusst sind! :-)

Ich hoffe, dass es mir helfen kann, dieses Problem zu lösen: Ich muss eine "Titelansicht" über alles hinzufügen, was gerade angezeigt wird. Es sollte auch funktionieren, wenn bereits ein oder mehrere modale Controller vorhanden sind. Wenn ich UIViewder Ansicht des Root-Controllers ein hinzufüge , sitzen die modalen Controller oben, ebenso die Popover-Controller. Wenn ich die Titelansicht modal präsentiere und es bereits einen modalen Controller gibt, wird nur ein Teil des Bildschirms abgedeckt.

Krumelur
quelle
Verwenden mehrerer UIWindows in iOS-Anwendungen shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Antworten:

26

A UIWindowkann über anderen UI-Elementen wie der Systemtastatur schweben.

So adressieren Sie Ihren letzten Absatz: Erstellen Sie einen UIWindowmit demselben Rahmen wie Ihr Hauptfenster. Setzen Sie seine windowLevelEigenschaft auf UIWindowLevelStatusBar. Setzen Sie seine hiddenEigenschaft auf NO.

Rob Mayoff
quelle
Ähm, in Ordnung. Vielen Dank. Ich wusste, dass. Können Sie meine Fragen etwas näher erläutern? Wissen Sie, wie Sie die RID eines Sekunden-UIWindow erhalten, das von makeKeyAndVisible hinzugefügt wurde?
Krumelur
Setzen Sie die versteckte Eigenschaft des zweiten UIWindow auf YES.
Rob Mayoff
Vielen Dank. Und ich zeige das Fenster, indem ich es schlüssig und sichtbar mache? Und ich verstecke es, indem ich ein anderes Fenster sichtbar mache und nur das andere entsorge? Wie kann ich ein UIWindow wie UIActionSheet animieren?
Krumelur
Sei vorsichtig damit. Bei! = UIWindowLevelNormal wird die Tastatur unter <iOS7 darunter angezeigt.
Shawn
108

Beginnend mit Robs Antwort habe ich ein bisschen herumgespielt und möchte einige Notizen für andere aufschreiben, die versuchen, Informationen zu diesem Thema zu erhalten:

  • Es ist überhaupt kein Problem, ein weiteres hinzuzufügen UIWindow. Erstellen Sie einfach eine und makeKeyAndVisible. Getan.
  • Entfernen Sie es, indem Sie ein anderes Fenster sichtbar machen, und lassen Sie dann das Fenster los, das Sie nicht mehr benötigen.
  • Das Fenster "Taste" empfängt alle Tastatureingaben.
  • UIWindow deckt alles ab, auch Modalitäten, Popover usw. Genial!
  • UIWindowist immer implizit Porträt. Es dreht sich nicht. Sie müssen einen Controller als Root-Controller des neuen Fensters hinzufügen und diesen die Drehung überlassen. (Genau wie das Hauptfenster)
  • Die Ebene des Fensters bestimmt, wie "hoch" es angezeigt wird. Stellen Sie es so ein UIWindowLevelStatusBar, dass es alles abdeckt. Setzen Sie seine hiddenEigenschaft auf NO.
  • Eine zweite UIWindowkann verwendet werden, um Ansichten auf den Bildschirm zu bringen, die über allem schweben. Ohne einen Dummy-Controller zu erstellen, nur um diesen in einen einzubetten UIPopoverController.
  • Dies kann besonders auf dem iPhone nützlich sein, wenn es keinen Popover-Controller gibt, Sie aber möglicherweise etwas Ähnliches nachahmen möchten.
  • Und ja, es hat natürlich mein Problem gelöst: Wenn die App die Aktivierung beendet, fügen Sie ein Deckfenster über den aktuell angezeigten Elementen hinzu, um zu verhindern, dass iOS einen Screenshot des aktuellen Inhalts Ihrer App erstellt.
Krumelur
quelle
Ohne Ihre Antwort hätte ich nicht den Mut gehabt, ein anderes UIWindow zu verwenden. Dies war auch äußerst hilfreich, da das zweite UIWindow nicht automatisch autorotiert werden konnte.
Dan Abramov
1
Sehr aufschlussreicher Beitrag. Aber was passiert, wenn Sie dieses Fenster verlassen und den zugrunde liegenden Fensterschlüssel sichtbar machen und der rootViewController dieses zugrunde liegenden Fensters derzeit über einen modalen Controller verfügt? Wird der Modal View Controller wieder angezeigt? Was in unserer Anwendung passiert, ist, dass rootViewController nicht der modale präsentiert wird ...
Nava Carmon
@Krumelur Das ist in Ordnung. Ich habe einen Zweifel. Angenommen, das 2. UIWindow wird über allen aktuellen Ansichten angezeigt. Wenn der Benutzer auf eine Schaltfläche in der Ansicht im 1. UIWindow klickt, in der ein weiterer Ansichtscontroller angezeigt wird. Dieses 2. UIWindow würde sich verstecken. So stellen Sie sicher, dass dieses UIWindow immer in der gesamten App angezeigt wird.
Easwaramoorthy K
1
Ich verwende UIWindow ständig, um benutzerdefinierte Warnansichten und iPhone-Popover zu implementieren. Es hilft, die Ansicht immer im Vollbildmodus zu erstellen, eine Vollbildansicht zu enthalten und eine weitere "Inhalts" -Ansicht darin einzubetten, damit die Außenansicht alle Berührungsereignisse abfängt (und ich einen schönen Schatten hinzufügen und meinen anderen Inhalt dimmen kann ^^)
Martin Ullrich
3
Es ist zu beachten, dass ein zweites Fenster nicht nur zur Sichtbarkeit beibehalten wird (im Gegensatz zu regulären Ansichten, die von ihrer Übersicht beibehalten werden).
Rivera
0

Hier ist Apples Dokumentation zum besseren Verständnis von UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Ein guter, wenn auch spezifischer Grund für die Verwendung mehrerer Instanzen von UIWindow ist, wenn Sie den App-Bildschirm per Video aufzeichnen müssen. Möglicherweise möchten Sie bestimmte Elemente (Aufnahmetaste, Aufnahmestatus usw.) nicht in das endgültig aufgenommene Video aufnehmen, sodass Sie diese Elemente in einem separaten UIWindow oben ablegen können.

In der Tat, wenn Sie ReplayKit verwenden, werden Sie müssen eine separate UIWindow für diese ausgeschlossenen UI - Elemente verwenden. Weitere Informationen hier: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Ivy Xing
quelle