web-dev-qa-db-fra.com

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

Récemment, je m'interrogeais sur le fait qu'une application iOS ne possède qu'une UIWindow. Il ne semble pas être un problème de créer une autre UIWindow et de la placer à l'écran.

Ma question est plutôt vague, mais je suis intéressée par:

  • Que pourrais-je potentiellement réaliser avec une seconde UIWindow qui ne puisse être réalisée autrement?
  • Que peut-il mal se passer lorsqu’on utilise plusieurs instances UIWindow?
  • J'ai vu que les gens utilisent une 2nd variable UIWindow pour afficher des vues popover semblables à des vues sur un iPhone. Est-ce une bonne façon de le faire? Pourquoi? Pourquoi pas?
  • Existe-t-il d'autres exemples où il est parfaitement logique d'avoir une autre variable UIWindow?

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

J'espère que cela pourra m'aider à résoudre ce problème: Je dois 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 une UIView à la vue du contrôleur racine, les contrôleurs modaux sont placés au-dessus, de même que les contrôleurs contextuels . 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.

83
Krumelur

Une UIWindow peut flotter au-dessus d'autres éléments de l'interface utilisateur, comme le clavier système.

Pour adresser votre dernier paragraphe: Faites une UIWindow avec le même cadre que votre fenêtre principale. Définissez sa propriété windowLevel sur UIWindowLevelStatusBar. Définissez sa propriété hidden sur NO.

20
rob mayoff

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

  • Ce n'est pas un problème d'ajouter une autre UIWindow. Il suffit de créer un et makeKeyAndVisible. Terminé.
  • Supprimez-le en rendant une autre fenêtre visible, puis relâchez celle dont vous n'avez plus besoin.
  • La fenêtre "clé" reçoit toutes les entrées au clavier.
  • UIWindow couvre tout, même les modaux, les popovers, etc. Brillant!
  • UIWindow est toujours un portrait implicite. Il ne tourne pas. Vous devrez ajouter un contrôleur en tant que contrôleur racine de la nouvelle fenêtre et le laisser gérer la rotation. (Juste comme la fenêtre principale)
  • Le niveau de la fenêtre détermine son "haut" affichage. Réglez-le sur UIWindowLevelStatusBar pour qu'il couvre tout. Définissez sa propriété hidden sur NO.
  • Une 2ème UIWindow peut être utilisée pour afficher sur l'écran des vues qui flottent au-dessus de tout. Sans créer de contrôleur factice pour l’intégrer dans une UIPopoverController.
  • Cela peut être particulièrement utile sur un iPhone où il n'y a pas de contrôleur popover, mais où vous voudrez peut-être imiter quelque chose de ce genre.
  • Et oui, cela a évidemment résolu mon problème: si l'application renonce à 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.
99
Krumelur