keyWindow no siempre devuelve un UIWindow

He estado usando [[UIApplication shanetworkingApplication] keyWindow] para get la vista visible de la pantalla en forma de UIView . Luego convierto esa vista en un UIImage para trabajar. Esto funciona muy bien, excepto en el caso en que muestro un UIAlertView al mismo time. En ese caso, keyWindow no está devolviendo una UIWindow como normalmente lo hace, sino que está devolviendo una UIModalItemHostingWindow , y después de convertir esa vista en una image es simplemente una captura de pantalla negra pura.

Ahora, los documentos dicen keyWindow "contiene el object UIWindow en el set de windows que más recientemente se envió al post makeKeyAndVisible".

Este UIModalItemHostingWindow debe ser debido a la alerta modal que estoy presentando, tal vez keyWindow está devolviendo esa vista en lugar de la pantalla completa.

Mi pregunta es, ¿cómo puedo garantizar siempre que obtengo una UIView que es una representación precisa de todo lo visible en la pantalla? Parece que keyWindow no es una buena solución. Una solución es retrasar todas las posibles alertas que arroje, pero me gustaría encontrar una solución mejor si es posible

use [[[UIApplication shanetworkingApplication] delegate] window]

en lugar de [[UIApplication shanetworkingApplication] keyWindow] .

Eso garantiza que obtendrá UIWindow que es la última vista de raíz de la aplicación.

Recorra todas las windows en order inverso (solo para hacer less iteraciones) y compruebe si la class de la window es estrictamente UIWindow :

 for (UIWindow *window in [[UIApplication shanetworkingApplication].windows reverseObjectEnumerator]) { if ([window class] == [UIWindow class]) { // do whatever you want with the window object break; } }