Avantages, problèmes, exemples d'ajout d'une autre UIWindow à une application iOS?

92

Récemment, je me suis interrogé sur le fait qu'une application iOS n'en a qu'une UIWindow. Cela ne semble pas être un problème d'en créer un autre UIWindowet de le placer à l'écran.

Ma question est assez vague, mais je m'intéresse à:

  • Que pourrais-je potentiellement accomplir avec une seconde UIWindowqui ne peut pas être fait autrement?
  • Qu'est-ce qui peut mal se passer lors de l'utilisation de plusieurs UIWindowinstances?
  • J'ai vu que les gens utilisent un 2ème UIWindowpour afficher des vues popover comme sur iPhone. Est-ce une bonne façon de procéder? Pourquoi? Pourquoi pas?
  • Y a-t-il d'autres exemples où il est parfaitement logique d'en avoir un autre UIWindow?

Ce n'est pas que je manque quelque chose. Je n'ai jamais ressenti le besoin de créer une autre UIWindowinstance mais peut-être que cela permettrait de faire des choses incroyables dont je ne suis pas au courant! :-)

J'espère que cela pourrait m'aider à résoudre ce problème: j'ai besoin d'ajouter une "vue de couverture" sur tout ce qui est actuellement affiché. Cela devrait également fonctionner s'il y a déjà un ou plusieurs contrôleurs modaux présentés. Si j'ajoute un UIViewà la vue du contrôleur racine, les contrôleurs modaux sont placés en haut, tout comme les contrôleurs popover. Si je présente la vue de couverture de manière modale et qu'il existe déjà un contrôleur modal, seule une partie de l'écran est couverte.

Krumelur
la source
Utilisation de plusieurs UIWindows dans les applications iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Réponses:

26

Un UIWindowpeut flotter au-dessus d'autres éléments de l'interface utilisateur comme le clavier système.

Pour aborder votre dernier paragraphe: Faites un UIWindowavec le même cadre que votre fenêtre principale. Définissez sa windowLevelpropriété sur UIWindowLevelStatusBar. Définissez sa hiddenpropriété sur NO.

Rob Mayoff
la source
Euh, d'accord. Merci. Je le savais. Pouvez-vous entrer un peu dans les détails de mes questions? Savez-vous comment obtenir le RID d'une UIWindow de secondes qui a été ajoutée par makeKeyAndVisible?
Krumelur
Définissez la deuxième propriété cachée de UIWindow sur YES.
rob mayoff
Merci. Et je montre la fenêtre en la rendant clé et visible? Et je le cache en rendant une AUTRE fenêtre visible et en jetant simplement l'autre? Comment puis-je animer une UIWindow comme UIActionSheet le fait?
Krumelur
Soyez prudent avec cela. Si at! = UIWindowLevelNormal, le clavier s'affichera en dessous sur <iOS7.
Shawn
108

En commençant par la réponse de Rob, j'ai joué un peu et j'aimerais écrire quelques notes pour les autres essayant d'obtenir des informations sur ce sujet:

  • Ce n'est pas du tout un problème d'en ajouter un autre UIWindow. Créez simplement un et makeKeyAndVisible. Terminé.
  • Supprimez-le en rendant une autre fenêtre visible, puis libérez celle dont vous n'avez plus besoin.
  • La fenêtre qui est "clé" reçoit toutes les entrées du clavier.
  • UIWindow couvre tout, même les modaux, les popovers, etc. Brillant!
  • UIWindowest toujours portrait implicitement. Il ne tourne pas. Vous devrez ajouter un contrôleur comme contrôleur racine de la nouvelle fenêtre et laisser celui-ci gérer la rotation. (Tout comme la fenêtre principale)
  • Le niveau de la fenêtre détermine la "hauteur" de son affichage. Réglez-le sur UIWindowLevelStatusBarpour qu'il couvre tout. Définissez sa hiddenpropriété sur NON.
  • Un 2ème UIWindowpeut être utilisé pour apporter des vues sur l'écran qui flottent au-dessus de tout. Sans créer un contrôleur factice juste pour l'intégrer dans un fichier UIPopoverController.
  • Cela peut être particulièrement utile sur iPhone où il n'y a pas de contrôleur popover mais où vous voudrez peut-être imiter quelque chose comme ça.
  • Et oui, cela a bien sûr résolu mon problème: si l'application annule l'activation, ajoutez une fenêtre de couverture sur tout ce qui est actuellement affiché pour empêcher iOS de prendre une capture d'écran du contenu actuel de votre application.
Krumelur
la source
Je n'aurais pas eu le courage d'utiliser une autre UIWindow sans votre réponse. Cela a également été extrêmement utile car la deuxième UIWindow ne fonctionnerait pas automatiquement.
Dan Abramov
1
Poste très instructif. Mais que se passe-t-il si vous démissionnez de cette fenêtre et rendez la fenêtre sous-jacente clé et visible et que rootViewController de cette fenêtre sous-jacente a un contrôleur modal actuellement présenté? Présentera-t-il le contrôleur de vue modale? Ce qui se passe dans notre application, c'est que rootViewController n'est pas présenté modal ...
Nava Carmon
@Krumelur C'est bien. J'ai un doute. C'est, disons, que la 2ème UIWindow est affichée au-dessus de toutes les vues actuelles. Lorsque l'utilisateur clique sur un bouton de la vue qui se trouve dans la 1ère UIWindow qui présente un autre contrôleur de vue. Cette 2ème UIWindow se cacherait. Comment faire en sorte que cette UIWindow soit toujours affichée dans toute l'application.
Easwaramoorthy K
1
J'utilise UIWindow tout le temps pour implémenter des vues d'alertes personnalisées et des popovers iphone. Cela aide à toujours créer la vue en plein écran, contenant une vue en plein écran et incorporant une autre vue de "contenu" à l'intérieur pour que la vue extérieure capte tous les événements tactiles (et je peux donc ajouter une belle ombre et atténuer mon autre contenu ^^)
Martin Ullrich
3
Il est à noter qu'une seconde fenêtre n'est pas conservée uniquement pour être visible (contrairement aux vues régulières conservées par leur supervision).
Rivera
0

Voici la documentation Apple pour mieux comprendre UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Une bonne raison, bien que spécifique, d'utiliser plusieurs instances d'UIWindow est lorsque vous devez enregistrer l'écran de l'application en vidéo. Il se peut que vous ne souhaitiez pas inclure certains éléments (bouton d'enregistrement, statut d'enregistrement, etc.) dans la vidéo enregistrée finale, vous pouvez donc placer ces éléments dans une UIWindow distincte en haut.

En fait, si vous utilisez ReplayKit, vous devez utiliser un UIWindow séparé pour ces éléments d'interface utilisateur exclus. Plus d'informations ici: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Ivy Xing
la source