UIWindow avec une taille incorrecte lors de l'utilisation de l'orientation paysage

J'ai une application vide et il n'y a pas de storyboard ou de xib impliqué. Je souhaite avoir une barre d'état masquée et ne prendre en charge que l'orientation paysage. Encore une fois, je ne veux pas faire ces changements uniquement dans le code et ne touchez pas à Info.plist.

Problème

Je crée un UIWindow avec un controller qui dit que la seule orientation supscope est le paysage. Dans ce cas mon UIWindow est créé dans la dimension du mode portrait et ne tourne pas. Le résultat attendu serait un écran complètement cyan.

UIWindow brisé

Ceci est mon délégué:

#import "AppDelegate.h" #import "AppViewController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor cyanColor]; self.window.rootViewController = [[AppViewController alloc] init]; [self.window makeKeyAndVisible]; return YES; } @end 

Ceci est mon controller:

 #import "AppViewController.h" @implementation AppViewController - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; } - (BOOL)prefersStatusBarHidden { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @end 

Ce que j'ai essayé jusqu'ici

Si je mets le rootViewController après avoir appelé makeKeyAndVisible tout semble fonctionner au début.

 self.window.backgroundColor = [UIColor cyanColor]; [self.window makeKeyAndVisible]; self.window.rootViewController = [[AppViewController alloc] init]; 

Il y a encore quelques problèmes. Tout d'abord je n'aime pas ça car il semble être très fragile. Le deuxième problème est que dans une application plus complexe qui définit un GLKViewController en tant que rootViewController, j'obtiens le résultat suivant (attendu qu'il n'y aurait pas de zone noire sur la gauche):

GLKViewController brisé

Il semble que la barre d'état ne soit pas masquée suffisamment tôt. Plusieurs reconnaisseurs de gestes sont actifs et dans GLKViewController et en cliquant sur la zone noire, vous obtenez le message suivant:

2014-09-25 13: 20: 42.170 StackOverflowExample [6971: 107907] window nil inattendue dans _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; cadre = (0 0; 375 667); userInteractionEnabled = NO; gestureRecognizers = NSArray: 0x7fa20b80a620; layer = UIWindowLayer: 0x7fa20b806890

J'ai également effectué diverses autres modifications, comme attacher un UIViewController vide et append ma vue en tant que sous-vue. Dans ce cas, ma vue semble correcte mais la window utilise toujours les mauvaises dimensions.

Tout tourne correctement si je ne remplace pas les methods supportedInterfaceOrientations dans mon controller de vue. Mais ce n'est bien sûr pas ce que je veux.

Lorsque vous exécutez l'application paysage à partir du mode portrait , UIScreen a des limites portrait dans iOS 8 (uniquement si vous n'avez pas cette application dans le panneau de commutation de l'application, car iOS 8 crée un cache). Même afficher une window avec makeKeyAndVisible ne change pas son image. Mais il change [UIScreen mainScreen].bounds fonction de l'orientation AppViewController de AppViewController .

 #import "AppDelegate.h" #import "AppViewController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Portrait bounds at this point self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.backgroundColor = [UIColor cyanColor]; self.window.rootViewController = [[AppViewController alloc] init]; [self.window makeKeyAndVisible]; return YES; } @end 

[self.window makeKeyAndVisible] le cadre de la window après [self.window makeKeyAndVisible]

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [UIWindow new]; self.window.backgroundColor = [UIColor cyanColor]; self.window.rootViewController = [[AppViewController alloc] init]; [self.window makeKeyAndVisible]; // Here it is self.window.frame = [UIScreen mainScreen].bounds; return YES; } 

Je pense que c'est iOS 8 bug.

J'ai eu un problème similaire, pour une application portrait uniquement.

J'ai corrigé le problème en définissant l'orientation de la barre d'état avant d'instancier l' UIWindow

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Init my stuff // ... // Prepare window [application setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; // prevent start orientation bug self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES; } 

Dans votre cas, vous devez utiliser UIInterfaceOrienationLandscapeLeft (ou Right) dans la setStatusBarOrientation:animated:

J'espère que cela vous aide.

Personnellement, aucune des solutions présentées ci-dessus n'a fonctionné. J'ai finalement mis "caché" à YES pour la window dans mon xib principal, comme suggéré ici: window nil inattendue dans _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow

Le problème est résolu lors de l'ajout d'un écran de lancement, que vous ne pouvez faire qu'en ajoutant une propriété supplémentaire à info.plist

J'ai eu ce problème moi-même, je ne suis pas sûr si vous pouvez l'append à travers le code si, j'ai seulement réussi à le faire fonctionner avec info.plist + file de lancement de l'écran xib

 <key>UILaunchStoryboardName</key> <ssortingng>Launch Screen</ssortingng> 

En fait, je ne pense pas que vous devez append un file xib, si seulement la key (avec n'importe quelle valeur) est disponible dans le plist cela devrait fonctionner.

Aucune des solutions affichées ici ou ailleurs n'a fonctionné pour moi.

Cependant, j'ai trouvé que ce problème ne se produisait apparemment pas avec Storyboards, donc une solution alternative est de s'éloigner de xibs. (Ce fait rend sortingstement improbable que Apple prenne le problème au sérieux.)