Personnalisé UIWindows ne tournent pas correctement dans iOS 8

Obtenir votre application en mode paysage et exécuter le code suivant:

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});

Dans iOS 7, vous obtiendrez un bleu transparent overlay sur le dessus de la totalité de l'écran qui disparaît au bout de 5 secondes. Dans iOS 8, vous obtiendrez un bleu transparent overlay qui couvre un peu plus de la moitié de l'écran

Personnalisé UIWindows ne tournent pas correctement dans iOS 8

De toute évidence, cela a quelque chose à voir avec le changement Apple dans iOS 8, où les coordonnées d'écran sont maintenant interface orientée au lieu de périphérique orienté, mais dans la vraie Pomme de mode, ils semblent avoir laissé une myriade de bugs dans le mode paysage et la rotation.

Je me permet de "corriger" cela en vérifiant si le dispositif d'orientation est paysage et de retourner la largeur et la hauteur de l'écran principal de limites, mais qui semble comme un horrible hack qui va briser quand Apple change tout nouveau dans iOS 9.

CGRect frame = [[UIScreen mainScreen] bounds];

if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    frame.size.width = frame.size.height;
    frame.size.height = [[UIScreen mainScreen] bounds].size.width;
}

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:frame];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});

Quelqu'un a été confronté à ce problème et de trouver une meilleure, moins cassants solution?

EDIT: je sais que je pourrais simplement utiliser une UIView et l'ajouter à la fenêtre clé mais je voudrais mettre quelque chose sur le dessus de la barre d'état.

Il n'y a rien dans la documentation qui est dit à l'aide de plusieurs UIWindows est faux. Les gens ont été en utilisant eux depuis iOS 2.
Je ne vois rien dans votre code qui est fragile. De quoi parles-tu? Si votre plainte est qu'il n'y a pas de mise en page automatique pour windows... alors la réponse est d'utiliser des points de vue au lieu de windows. Simple.
C'est ce qu'Apple a dit à propos de windows: "la Plupart des applications iOS de créer et d'utiliser une seule fenêtre au cours de leur vie. [...] Toutefois, si l'application prend en charge l'utilisation d'un écran externe pour la vidéo, elle peut créer une nouvelle fenêtre pour afficher du contenu sur un écran externe. Toutes les autres fenêtres sont généralement créés par le système". En d'autres termes, si vous en sortez Apple a recommandé l'utilisation de windows, alors vous êtes sur votre propre et Apple ne va pas faire quelque chose pour le faire à l'aide de plusieurs fenêtres facile ni qu'ils s'excluent eux-mêmes des changements incompatibles.
Sérieusement, je suis avec Reid, où en êtes-vous de cette information? UIWindowLevel de l'empilement de niveau est disponible dans UIKit depuis iOS 2.0 et avec iOS 7, la raison de l'utilisation de cette API n'a jamais été mieux!
En disant "la Plupart des applications iOS de créer et d'utiliser une seule fenêtre..." pas, une recommandation, un simple état de fait. les Applications iOS ont été en utilisant des Fenêtres multiples, pour un long temps, et Apple briser ce devrait être reconnue comme un échec de leur part, pas le nôtre.

OriginalL'auteur Reid Main | 2014-11-03