¿Ventajas, problemas, ejemplos de cómo agregar otra UIWindow a una aplicación de iOS?


92

Recientemente, me he estado preguntando sobre el hecho de que una aplicación de iOS solo tiene una UIWindow. No parece ser un problema crear otro UIWindowy colocarlo en pantalla.

Mi pregunta es un poco vaga, pero me interesa:

  • ¿Qué podría lograr potencialmente con un segundo UIWindowque no se pueda hacer de otra manera?
  • ¿Qué puede salir mal al utilizar varias UIWindowinstancias?
  • He visto que la gente usa un segundo UIWindowpara mostrar vistas tipo popover en iPhone. ¿Es esta una buena forma de hacerlo? ¿Por qué? Por qué no?
  • ¿Hay otros ejemplos en los que tenga mucho sentido tener otro UIWindow?

No es que me esté perdiendo algo. Nunca sentí la necesidad de crear otra UIWindowinstancia, ¡pero tal vez permitiría hacer cosas increíbles de las que no soy consciente! :-)

Espero que pueda ayudarme a resolver este problema: necesito agregar una "vista de portada" sobre lo que se muestra actualmente. También debería funcionar si ya se han presentado uno o más controladores modales. Si agrego un UIViewa la vista del controlador raíz, los controladores modales se ubican en la parte superior, al igual que los controladores popover. Si presento la vista de portada de manera modal y ya hay un controlador modal, solo se cubre parte de la pantalla.


Uso de múltiples UIWindows en aplicaciones iOS shaune.com.au/using-multiple-uiwindows-in-ios-applications
onmyway133

Respuestas:


26

A UIWindowpuede flotar por encima de otros elementos de la interfaz de usuario como el teclado del sistema.

Para abordar su último párrafo: Haga un UIWindowcon el mismo marco que su ventana principal. Establezca su windowLevelpropiedad en UIWindowLevelStatusBar. Establezca su hiddenpropiedad en NO.


Err, está bien. Gracias. Lo sabía. ¿Puedes entrar en detalles con mis preguntas? ¿Sabe cómo obtener RID de una UIWindow de segundos que fue agregada por makeKeyAndVisible?
Krumelur

Establezca la propiedad oculta de la segunda UIWindow en YES.
rob mayoff

Gracias. ¿Y muestro la ventana haciéndola clave y visible? ¿Y lo oculto haciendo OTRA ventana visible y simplemente desechando la otra? ¿Cómo puedo animar una UIWindow como lo hace UIActionSheet?
Krumelur

Tenga cuidado con esto. Si está en! = UIWindowLevelNormal, el teclado se mostrará debajo en <iOS7.
Shawn

108

Comenzando con la respuesta de Rob, jugué un poco y me gustaría escribir algunas notas para otros tratando de obtener información sobre este tema:

  • No supone ningún problema añadir otro UIWindow. Solo crea uno y makeKeyAndVisible. Hecho.
  • Elimínelo haciendo que otra ventana sea visible, luego suelte la que ya no necesita.
  • La ventana que es "clave" recibe toda la entrada del teclado.
  • UIWindow cubre todo, incluso modales, popovers, etc. ¡Brillante!
  • UIWindowes siempre retrato implícitamente. No gira. Tendrá que agregar un controlador como controlador raíz de la nueva ventana y dejar que maneje la rotación. (Como la ventana principal)
  • El nivel de la ventana determina qué tan "alto" se muestra. Configúrelo para UIWindowLevelStatusBarque cubra todo. Establezca su hiddenpropiedad en NO.
  • Se UIWindowpuede usar un segundo para traer vistas en la pantalla que flotan encima de todo. Sin crear un controlador ficticio solo para incrustarlo en un UIPopoverController.
  • Puede ser especialmente útil en iPhone donde no hay un controlador popover pero donde es posible que desee imitar algo así.
  • Y sí, por supuesto, resolvió mi problema: si la aplicación renuncia a la activación, agregue una ventana de portada sobre lo que se muestra actualmente para evitar que iOS tome una captura de pantalla del contenido actual de su aplicación.

No habría tenido el valor de usar otra UIWindow si no fuera por tu respuesta. Esto también fue extremadamente útil porque la segunda UIWindow no rotaría automáticamente por sí sola.
Dan Abramov

1
Post muy esclarecedor. Pero, ¿qué sucede si renuncia a esta ventana y hace que la clave de la ventana subyacente sea visible y el rootViewController de esta ventana subyacente tiene un controlador modal presentado actualmente? ¿Volverá a presentar el controlador de vista modal? Lo que sucede en nuestra aplicación es que se presenta rootViewController no el modal ...
Nava Carmon

@Krumelur Esto está bien. Tengo una duda. Es decir, se muestra la segunda UIWindow encima de todas las vistas actuales. Cuando el usuario hace clic en un botón en la vista que se encuentra en la primera UIWindow que presenta un controlador de vista más. Esta segunda UIWindow se escondería. Cómo hacer que esta UIWindow se muestre siempre en toda la aplicación.
Easwaramoorthy K

1
Uso UIWindow todo el tiempo para implementar vistas de alerta de estilo personalizado y popovers de iphone. Siempre ayuda a hacer la vista en pantalla completa, que contiene una vista de pantalla completa e incrusta otra vista de "contenido" en el interior para que la vista exterior capte cualquier evento táctil (y así puedo agregar una sombra agradable y atenuar mi otro contenido ^^)
Martin Ullrich

3
Cabe señalar que una segunda ventana no se retiene solo por ser visible (en contraste con las vistas regulares que se retienen en su supervista).
Rivera

0

Aquí está la documentación de Apple para comprender mejor UIWindow: https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

Una buena razón, aunque específica, para usar varias instancias de UIWindow es cuando necesita grabar en video la pantalla de la aplicación. Es posible que no desee incluir ciertos elementos (botón de grabación, estado de grabación, etc.) en el video grabado final, por lo que puede colocar esos elementos en una UIWindow separada en la parte superior.

De hecho, si está usando ReplayKit, tendrá que usar una UIWindow separada para estos elementos de UI excluidos. Más información aquí: https://medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.