Problema de rotación de iOS 6: sin rotación desde el controlador de vista modal presentado

Tengo un MainViewController que tiene un botón que empuja una nueva vista (InfoViewController), a través de flip horizontailly. al igual que:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; 

El controlador MainView admite Portrait y PortraitUpsideDown. Al igual que:

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); } 

En mi InfoViewController también indica el código anterior. En mi AppDelegate tiene esto en las LaunchOptions:

 [self.window setRootViewController:self.mainViewController]; 

En mi archivo app.plist admite todas las orientaciones. Esto se debe a que otras vistas también necesitan ser compatibles con el paisaje. Por lo tanto, en mi MainViewController y InfoViewController solo necesito Portrait y PortraitUpsideDown. Pero en otra vista, necesito todas las conservaciones.

Mi MainViewController funciona bien, pero mi InfoViewController funciona para todas las orientaciones.

Estoy teniendo dificultades extremas para que esto funcione en iOS6. Investigué otras publicaciones y probé la asistencia que otras personas me brindaron, pero no tuve suerte en absoluto. Por favor alguien puede ayudarme a lograr esto gracias. Y soy un novato en Objective-C: p

No admita todas las orientaciones en su archivo de aplicación, solo aquellas compatibles con su controlador de vista raíz.

La autorotación está cambiando en iOS 6. En iOS 6, el método shouldAutorotateToInterfaceOrientation: de UIViewController está en desuso. En su lugar, debe usar la shouldAutorotate supportedInterfaceOrientationsForWindow: para la shouldAutorotate supportedInterfaceOrientationsForWindow: y shouldAutorotate métodos:

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAllButUpsideDown; } 

Modal ViewControllers ya no recibe llamadas de rotación en iOS 6: willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, and didRotateFromInterfaceOrientation: métodos ya no se didRotateFromInterfaceOrientation: en ningún controlador de vista que haga una presentación de pantalla completa sobre sí mismo, por ejemplo, los que se llaman con: presentViewController:animated:completion:

Puede dejar que el controlador de vista que presenta su controlador de vista modal le informe sobre la rotación. Además, ahora usa: presentViewController:animated:completion: para presentar el controlador de vista. presentModalViewController:animated: está en desuso, y lo usas en el código.

He resuelto problemas similares, mientras usaba el controlador de la barra de tabs.

Subclase UITabBarController. Implementa estos métodos:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } - (BOOL)shouldAutorotate { NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]); for (UIViewController *viewController in self.viewControllers) { [viewController shouldAutorotate]; } return YES; } 

Si desea manejar las rotaciones en los controladores dentro de tabbarcontroller, en cada uno de los controladores en la barra de tabs el controlador implementa esos métodos también y escribe el código para manejar el cambio de orientación. Si no quiere manejarlo, entonces no necesita implementar esos métodos. Los métodos de TabBarControllers siempre se ejecutarán cuando cambie la orientación. Incluso dos veces por razones desconocidas.

Sí, y no olvides eliminar todos los métodos de shouldAutorotate. Me moví completamente al nuevo modelo de orientación. Si quieres que se queden, probablemente sea más difícil.

Cree una categoría mediante la subclasificación de UINavigationController e implemente los siguientes métodos en el archivo .h

 -(BOOL)shouldAutorotate; -(NSUInteger)supportedInterfaceOrientations; - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; in .m file -(BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.topViewController preferredInterfaceOrientationForPresentation]; } 

e implemente los siguientes metodos en la clase de controlador de vista, la clase desea habilitar la rotación

 -(NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown); } - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; } 

agregue este código en la Subclase UITabBarController .m

 @implementation UINavigationController (rotation) //temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers. - (NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } @end @implementation NameClassUITabBar - (void)viewDidLoad { [super viewDidLoad]; } - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @end 

Aquí he publicado mi solución / experiencia en el controlador de la barra de tabs con rotaciones: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html