UINavigationController Force Girar

Mi aplicación es principalmente retrato, sin embargo, hay una vista que REQUIERE una orientación horizontal.

Mis opiniones están contenidas en un UINavigationController, que (aparentemente) es la causa de este problema.

Todos los UIViewControllers excepto uno tienen esto:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } 

El UIViewController que requiere Landscape tiene esto:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); } 

Ahora, lo que sucede es que cuando el usuario llega al paisaje UIViewController, se muestra en vertical. El usuario puede rotar su teléfono y se muestra en el paisaje como yo quiero (locking a horizontal). El usuario luego avanza hacia un UIViewController vertical y sucede lo mismo: comienza en el paisaje, luego gira su teléfono y se vuelve a retratar (y se bloquea a vertical).

Parece que el locking de orientación está permitido entre UIViewControllers, sin embargo, la rotación automática / cambio de la orientación de forma progtwigda está bloqueada de alguna manera.

¿Cómo obligo al teléfono a actualizar a la orientación correcta?

Existe una solución temporal: puedo detectar la orientación del dispositivo y mostrar un mensaje pidiéndoles que giren el dispositivo si no es correcto, aunque esto no es óptimo.

¡Tenía el mismo requisito para una de mis aplicaciones!

¡afortunadamente encontré una solución!

Para mantener el outlook del viewcontroller principal, sin importar desde qué orientación fue sacado / empujado, hice lo siguiente: (en viewWillAppear 🙂

 //set statusbar to the desired rotation position [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; //present/dismiss viewcontroller in order to activate rotating. UIViewController *mVC = [[[UIViewController alloc] init] autorelease]; [self presentModalViewController:mVC animated:NO]; [self dismissModalViewControllerAnimated:NO]; 

PSTested en sdk 3.2.5 ios 5.0.1.

PD En iOS 8 la respuesta anterior da como resultado un parpadeo de la pantalla y también – no es estable (en algunos casos ya no funciona para mí). Por lo tanto, para mis necesidades, cambié el código a: (ARC)

 //set statusbar to the desired rotation position [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:NO]; [self.navigationController presentViewController:[UIViewController new] animated:NO completion:^{ dispatch_after(0, dispatch_get_main_queue(), ^{ [self.navigationController dismissViewControllerAnimated:NO completion:nil]; }); }]; //I added this code in viewDidDissapear on viewController class, which will be popped back. 

¡Espero que ayude!

Esto podría ayudar. Puede llamar al siguiente método al aparecer, según corresponda. por ejemplo, en -viewWillAppear:animated

attemptRotationToDeviceOrientation Intenta rotar todas las ventanas según la orientación del dispositivo.

 + (void)attemptRotationToDeviceOrientation 

Discusión

Algunos controladores de vista pueden querer utilizar condiciones específicas de la aplicación para determinar el valor de retorno de su implementación del método shouldAutorotateToInterfaceOrientation :. Si su controlador de vista hace esto, cuando esas condiciones cambian, su aplicación debe llamar a este método de clase. El sistema inmediatamente intenta rotar a la nueva orientación. Se produce una rotación siempre que cada controlador de vista relevante devuelva SÍ en su implementación del método shouldAutorotateToInterfaceOrientation :.

Disponibilidad

Disponible en iOS 5.0 y posterior. http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

Utilizar esta,

 [[UIDevice currentDevice]performSelector:@selector(setOrientation:) withObject:(__bridge id)((void *)UIInterfaceOrientationLandscapeRight)];