iOS 6: cómo forzar la orientación de cambio cuando se empuja el controller de vista hacia la stack del controller de navigation

Creo que esta pregunta debería haberse preguntado un millón de veces, pero todavía no puedo encontrar una respuesta a esto.

Aquí está mi jerarquía: UINavigationController -> UIViewController 1 -> (push) -> UIViewController 2

UINavigationController: es compatible con todas las orientaciones posibles UIViewController 1: solo es compatible con portrait UIViewController 2: solo admite landscape

¿Cómo puedo bloquear UIViewController 1 en vertical y al mismo time bloquear UIViewController 2 en horizontal? ¿Es incluso posible? Hasta ahora lo que veo es que UIViewController 2 siempre toma la orientación de UIViewController 1.

Tenga en count que esto es solo para iOS 6.

¡Gracias!

También encuentro el mismo problema. He descubierto que la function ShouldAutorotate no debería llamarse cada vez, así que cambio la orientación programática

primero importa esto

#import <objc/message.h> 

entonces

 -(void)viewDidAppear:(BOOL)animated { if(UIDeviceOrientationIsPortrait(self.interfaceOrientation)){ if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) { objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft ); } } } 

Espero que esto te ayude.

Agregue una nueva class Objective-C (subclass UINavigationController) y agregue el siguiente código a los files .m

 -(NSUInteger)supportedInterfaceOrientations { NSLog(@"supportedInterfaceOrientations = %d ", [self.topViewController supportedInterfaceOrientations]); return [self.topViewController supportedInterfaceOrientations]; } -(BOOL)shouldAutorotate { return self.topViewController.shouldAutorotate; } -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // You do not need this method if you are not supporting earlier iOS Versions return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; } 

Después de agregar las nuevas classs, vaya a las classs de ViewController y realice los siguientes cambios

 - (BOOL)shouldAutorotate // iOS 6 autorotation fix { return YES; } - (NSUInteger)supportedInterfaceOrientations // iOS 6 autorotation fix { return UIInterfaceOrientationMaskAll; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation // iOS 6 autorotation fix { return UIInterfaceOrientationPortrait; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return YES; } 

introduzca la descripción de la imagen aquí

En shouldAutorotate, shouldAutorotateToInterfaceOrientation: devuelva YES si desea que el ViewController sea compatible con Múltiples orientaciones, o bien devuelva NO, también en houldAutorotateToInterfaceOrientation: el método pasa la Orintation que desea para ese ViewController específico, Repita lo mismo para todos los controlleres de vista.

Motivo de hacer esto:

1: Aunque puede cambiar el prefernetworkingInterfaceOrientationForPresentation: de cualquier viewController a una orientación específica, pero dado que está utilizando el UINavigationController, también debe anular SupportInterfaceOrientations para su UINavigationController

2: Con el fin de anular el SupportInterfaceOrientations para UINavigationController tenemos UINavigationController subclasificado y modificamos el método relacionado con UINavigation Orientation.

Espero que te ayude !

Haga que la aplicación admita solo el modo vertical y agregue la siguiente línea al initWithNibName de UIViewController 2

 self.view.transform = CGAffineTransformMakeRotation(M_PI/2);