iOS 6 – Rotaciones de paisaje del controller de navigation para algunas vistas, mientras que otras solo retrato

Estoy construyendo una aplicación que será vertical solo para las vistas principales (tanto normales como invertidas). He configurado esta configuration en Project Settings / Plist y todo funciona bien. Sin embargo, tengo algunas vistas modal que hacen cosas como mostrar imágenes / videos, y quiero que puedan rotar a TODAS las orientaciones.

Intenté agregar una categoría para UINavigationController pero no tuve suerte. También he agregado al viewController que llama al modal el siguiente código:

-(BOOL)shouldAutomaticallyForwardAppearanceMethods{ return NO; } -(BOOL)shouldAutomaticallyForwardRotationMethods{ return NO; } 

He agregado el código siguiente a los modal viewControllers que quiero permitir todas las orientaciones:

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

¿Qué me estoy perdiendo? ¿Alguna sugerencia?

En iOS 6, el event handling rotation ha cambiado. Para el problema que describiste, hay varios enfoques. Primero, en el plist, habilite todas las orientaciones, excepto el retrato al revés.

Entonces podrías usar una de las siguientes soluciones:

  1. Use una subclass de UINavigationController que solo permita la rotation de retrato.
  2. Para todos los controlleres, especifique qué rotaciones admiten.
  3. Puede anular un método en su delegado de la aplicación. Como ese método se invoca en su delegado cada vez que cambia la orientación o se empuja un nuevo controller de vista, puede usarlo para habilitar / deshabilitar temporalmente la visualización de paisaje para su aplicación:

     // In AppDelegate.h: @property (nonatomic) BOOL portraitOnly; // In AppDelegate.m: - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return _portraitOnly ? UIInterfaceOrientationMaskPortrait : UIInterfaceOrientationMaskAllButUpsideDown; } // to switch to portrait only: ((AppDelegate *)[UIApplication shanetworkingApplication].delegate).portraitOnly = YES; // to switch to allowing landscape orientations: ((AppDelegate *)[UIApplication shanetworkingApplication].delegate).portraitOnly = NO; 

Debe habilitar la rotation para los viewControllers que son antepasados ​​en la jerarquía en su configuration de compilation (para permitir que los VC's inferiores en la jerarquía puedan rotar si lo desean). Y luego devuelva la lógica adecuada de shouldAutoRotate , supportedInterfaceOrientations , y willAnimateRotationToInterfaceOrientation en cada viewController.

-Retorno NO de shouldAutoRotate para los viewControllers que no se mueven en absoluto.

-Y del mismo modo, devuelva YES de shouldAutoRotate y devuelva las orientaciones válidas en ese VC desde supportedInterfaceOrientations

willAnimateRotationToInterfaceOrientation para realizar cualquier limpieza de último minuto o cambios de datos que necesite hacer antes de que aparezca la nueva orientación.

No dude en hacérmelo saber si todavía tiene problemas. ¡Espero eso ayude!