¿Por qué en iOS 8 mi aplicación en el lanzamiento toma una orientación incorrecta?

mi aplicación hasta iOS 7 funciona correctamente. Lo probé hoy con Xcode 6 y cuando lo ejecuto tengo una desagradable sorpresa :(:

introduzca la descripción de la imagen aquí Puedes ver que Xcode ahora dibuja mi viewController como si estuviera en modo vertical pero como puedes ver está en modo horizontal.

¿Sabes qué se cambia en iOS 8? : / Utilicé los siguientes methods de orientación:

  • (NSUInteger) soportado en interfaces de interfaz
  • (BOOL) debería autorizar
  • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation

EDITAR:

Acabo de descubrir este método:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskLandscape; } 

Y ahora mis primeros viewcontrollers funcionan correctamente :). el problema es cuando muestro un modal (que cambia el set de methods en UIInterfaceOrientationMaskAll) rehace el efecto desagradable de la captura de pantalla. Precisamente cambio mis methods en este modo:

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if(self.restrictRotation) { return UIInterfaceOrientationMaskLandscape; } else { return UIInterfaceOrientationMaskAll; } } // THIS IS A DELEGATE OF MODAL VIEW CONTROLLER - (void)updateInterfaceAfterDocumentPreviewViewController { NSLog(@"updateInterfaceAfterDocumentPreviewViewController"); [[UIApplication shanetworkingApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft]; AppDelegate* appDelegate = (AppDelegate*)[UIApplication shanetworkingApplication].delegate; appDelegate.restrictRotation = YES; } 

Pruebe el siguiente código

En didFinishLaunchingWithOptions de AppDelegate

 self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; [self.window setFrame:[[UIScreen mainScreen] bounds]]; //Add 

El problema parece ser el order de las llamadas cuando configura la window. makeKeyAndVisible llamar a makeKeyAndVisible antes de asignar el rootViewController en su método didFinishLaunchingWithOptions en el delegado de la aplicación. Los siguientes trabajos:

 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; [self.window makeKeyAndVisible]; self.window.rootViewController = self.myMainViewController; 

Pero si cambia el order para:

 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.rootViewController = self.myMainViewController; [self.window makeKeyAndVisible]; 

Obtiene el comportamiento que está experimentando.

Tuve el mismo problema exacto con una "pantalla de carga". Esto es lo que funcionó para mí. ( Tenga en count: mi aplicación solo admite iOS 7 o posterior, modo horizontal ):

  CGRect theFrame = self.view.frame; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) { CGRect screenBounds = [[UIScreen mainScreen] bounds]; theFrame.origin = CGPointZero; theFrame.size.width = screenBounds.size.height; theFrame.size.height = screenBounds.size.width; } NSLog(@"%@", [NSNumber valueWithCGRect:theFrame]); self.loadingScreen = [[UIView alloc] initWithFrame:theFrame]; 

Consulte la respuesta de Mike Hay si su aplicación admite la orientación vertical y la "forma larga de calcular la aplicación correcta": https://stackoverflow.com/a/18072095/4108485

Espero que esto ayude.

Eche un vistazo a su file .plist.

  1. Asegúrese de tener "Orientación de la interfaz inicial" configurada como la orientación que deseaba.
  2. En las "Orientaciones de interfaz admitidas", tenga la orientación preferida como la primera input en la list (parece que Apple cambió este order).

Estaba teniendo un problema similar, no pude get las imágenes de lanzamiento correctas para mostrar (tenía dos para iPad, Default-Portrait.png y Default-Landscape.png) y tampoco pude conseguir que la aplicación se orientara automáticamente después de que desapareció la image de lanzamiento.

Para resolver el problema de las imágenes de lanzamiento:

  • Vaya a la sección Propiedades del Objetivo iOS personalizado del proyecto (Haga clic en el ícono de su Proyecto en la parte superior de la list de files del proyecto, y debería ser la primera sección que ve).
  • Agregue una fila a esa tabla llamada "Lanzar image" (debería completarse automáticamente) e ingrese "Pnetworkingeterminado" como la cadena en la columna derecha.
  • Asegúrese de que sus imágenes de lanzamiento sigan las pautas del nombre de file de Apple (es decir: Default-568 @ 2x, Default @ 2x, etc.) compruebe esta respuesta SO

Para resolver el problema de orientación de la aplicación al principio ViewController:

  • Vaya al file plist de sus proyectos (debería ser "YourApp-Info.plist")
  • Agregue una fila e ingrese "Orientaciones de interfaz admitidas"
  • Agregue las orientaciones que admite su aplicación.

Ese enfoque para detectar la orientación estaba en desuso en iOS8 (pero todavía está permitido ahora). Fue reemplazado por el concepto de Clases de Tamaño y Colecciones de Rasgos .

(Curiosamente, no puedo encontrar una reference de class de tamaño en los documentos de Apple en línea en este momento, juraría que estaba allí antes, tal vez en XCode). Vea aquí los videos de WWDC.

De todos modos, hay una checkbox en Interface Builder que dice " Usar classs de tamaño ". Podría haberlo verificado. ¿Apágalo y vea si eso ayuda?

Solución Oldschool:

 BOOL portrait; BOOL iOS8OrLater = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0); if (iOS8OrLater) { CGFloat height = CGRectGetHeight(self.view.frame); CGFloat width = CGRectGetWidth(self.view.frame); if (width / height > 1.0) { portrait = NO; } else { portrait = YES; } } else { portrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation); } if(portrait) { [self layoutPortrait]; } else { [self layoutLandscape]; } 

Puede llamar a esto en viewWillLayoutSubviews

 UIInterfaceOrientation currentOrientation = [UIApplication shanetworkingApplication].statusBarOrientation; if( UIDeviceOrientationIsLandscape( currentOrientation ) ) { if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { [[UIApplication shanetworkingApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; // -- Fix for rotation issue for ios 8 if( IS_IOS_8_OR_LATER ) { UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle: nil]; // -- Set frame of nav controller UINavigationController *nc = [storyboard instantiateViewControllerWithIdentifier:@"NavController"]; self.window.rootViewController = nc; [self.window setFrame:[[UIScreen mainScreen] bounds]]; // -- Set fame of home view controller UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"Home"]; self.window.rootViewController = vc; [self.window makeKeyAndVisible]; [self.window setFrame:[[UIScreen mainScreen] bounds]]; } } }