ios objective-c iphone landscape uiwindow

ios - UIWindow con tamaño incorrecto cuando se utiliza la orientación horizontal



objective-c iphone (5)

Tengo una aplicación vacía y no hay un storyboard o xib involucrado. Quiero tener una barra de estado oculta y apoyar solo la orientación horizontal. Una vez más, no voy a hacer esos cambios solo dentro del código y no toque la lista de información.

Problema

Creo un UIWindow con un controlador que dice que la única orientación compatible es la horizontal. En ese caso, mi UIWindow se crea en la dimensión del modo vertical y no gira. El resultado esperado sería una pantalla completamente cian.

Este es mi delegado:

#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

Este es mi controlador:

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

Lo que he probado hasta ahora

Si configuro rootViewController después de llamar a makeKeyAndVisible, todo parece funcionar al principio.

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

Todavía hay algunos problemas. En primer lugar no me gusta esto ya que parece ser muy frágil. El segundo problema es que en una aplicación más compleja que establece un GLKViewController como rootViewController obtengo el siguiente resultado (se espera que no haya un área negra a la izquierda):

Parece que la barra de estado no se oculta lo suficientemente temprano. Varios reconocedores de gestos están activos y en GLKViewController y al hacer clic en el área negra aparece el siguiente mensaje de registro:

2014-09-25 13: 20: 42.170 StackOverflowExample [6971: 107907] ventana nula inesperada en _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: UIClassicWindow: 0x7fa20b805e00; marco = (0 0; 375 667); userInteractionEnabled = NO; gestos de reconocimiento = NSArray: 0x7fa20b80a620; layer = UIWindowLayer: 0x7fa20b806890

También realicé varios otros cambios, como adjuntar un UIViewController vacío y agregar mi vista como una vista secundaria. En ese caso, mi vista se ve correcta pero la ventana sigue usando las dimensiones incorrectas.

Todo gira correctamente si no anulo los métodos SupportInterfaceOrientations en mi controlador de vista. Pero eso, por supuesto, no es lo que quiero.


Cuando ejecuta la aplicación horizontal desde el modo vertical , UIScreen tiene límites verticales en iOS 8 (solo si no tiene esta aplicación en el panel de cambio de aplicación, ya que iOS 8 hace algo de caché). Incluso la visualización de la ventana con makeKeyAndVisible no cambia su marco. Pero cambia [UIScreen mainScreen].bounds acuerdo con la orientación disponible 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

Así que cambiemos el marco de la ventana después de [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; }

Creo que es un error de iOS 8.


El problema se resuelve al agregar una pantalla de inicio, que solo puede hacer agregando una propiedad adicional a info.plist

tuve este problema yo mismo, no estoy seguro de que pueda agregarlo a través del código, solo logré que funcionara con info.plist + Launch Screen xib file

<key>UILaunchStoryboardName</key> <string>Launch Screen</string>

En realidad, no creo que tenga que agregar un archivo xib, si solo la clave (con cualquier valor) está disponible en la lista, debería funcionar.


Ninguna de las soluciones publicadas aquí o en otra parte funcionó para mí.

Sin embargo, encontré que este problema aparentemente no ocurre con los Guiones gráficos, por lo que una solución alternativa es alejarse de los xibs. (Lamentablemente, este hecho también hace que sea poco probable que Apple se tome el problema en serio).



Tuve un problema similar, para una aplicación solo para retratos.

UIWindow el problema configurando la orientación de la barra de estado ANTES de crear una instancia de 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; }

En su caso, debe usar UIInterfaceOrienationLandscapeLeft (o Derecha) en el setStatusBarOrientation:animated:

Espero que te ayude.