iOS 6 debería autorizar: NO se está llamando

He estado buscando en Internet una solución a esto, pero no encuentro nada. Estoy tratando de hacer compatible mi iOS 5 con la aplicación iOS 6. No puedo hacer que las cosas de orientación funcionen bien. No puedo detectar cuándo está a punto de ocurrir una rotation. Aquí está el código que estoy intentando:

- (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } // pre-iOS 6 support - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (toInterfaceOrientation == UIInterfaceOrientationPortrait); } 

El nuevo método supportInterfaceOrientation: se llama simplemente bien. El método shouldAutorotate, sin embargo, no se disparará. Necesito hacer un intercambio de imágenes al rotar, pero no puedo get ninguna indicación de que se producirá una rotation.

Gracias por adelantado.

Vea si recibe el siguiente error cuando se inicia su aplicación.

Se espera que las windows de la aplicación tengan un controller de vista raíz al final del lanzamiento de la aplicación

Si es así, la forma de solucionarlo es haciendo el siguiente cambio en el file AppDelegate.m (aunque parece haber varias respuestas para solucionarlo):

 // Replace [self.window addSubview:[navigationController view]]; //OLD // With [self.window setRootViewController:navigationController]; //NEW 

Después de esto, shouldAutoRotate debería llamarse correctamente.

Cuando utilizo UINavigationController como la base de una aplicación, utilizo la siguiente subclass para darme la flexibilidad de permitir que el controller de la vista principal de la mayoría de los niños decida sobre la rotation.

 @interface RotationAwareNavigationController : UINavigationController @end @implementation RotationAwareNavigationController -(NSUInteger)supportedInterfaceOrientations { UIViewController *top = self.topViewController; return top.supportedInterfaceOrientations; } -(BOOL)shouldAutorotate { UIViewController *top = self.topViewController; return [top shouldAutorotate]; } @end 

Ese método no es la forma correcta de determinar eso. El método correcto es willRotateToInterfaceOrientation:duration:

El método should rotate to orientation (a diferencia de ifAutorotate) está desaprobado y ya no se llamará a partir de iOS 6, pero no fue diseñado para usarlo de la forma en que lo usaste de todos modos.

EDITAR Respuesta a votos repetidos repetidos. Explique por qué usar el método que indiqué no es una indicación (para indicar OP) "indica que una rotation está a punto de ocurrir". El contenido de la pregunta y el título no coinciden.

Parece que en iOS 6 el controller de navigation del contenedor no consulta los controlleres de vista secundarios al girar:

en notas de la versión de iOS 6 :

Ahora, los contenedores de iOS (como UINavigationController) no consultan a sus hijos para determinar si deben autoarreglar. De forma pnetworkingeterminada, las orientaciones de la interfaz compatibles con la aplicación y el controller de vista están configuradas en UIInterfaceOrientationMaskAll para el idioma de iPad y UIInterfaceOrientationMaskAllButUpsideDown para el idioma de iPhone.

Este comportamiento es fácil de probar. Lo que hice fue usar el mismo controller de vista personalizado

  1. primer caso como controller de vista principal
  2. segundo caso como hijo de UIPageViewController

En el primer caso, todo se decide en el controller de navigation personalizado mediante la combinación de shouldAutorotate y shouldAutorotate dado que shouldAutorotate constring con las orientaciones compatibles de la aplicación.

En el segundo caso, incluso si el UIPageViewController invoca el SupportInterfaceOrientations del controller de vista personalizado, el valor de retorno no se toma en consideración. Funciona si los dos methods se sobrescriben en una subclass del UIPageViewController. No estoy seguro acerca de los efectos secundarios de eso ya que esta class no debe subclass.

Si su viewController es un child viewController en un UINavigationController , puede hacer lo siguiente:

  • Subclass UINavigationController
  • override shouldAutoRotate en tu subclass
  • envíe a su topViewController este post cuando se topViewController este método

// Este método está dentro de su subclass UINavigationController

 - (BOOL)shouldAutorotate { if([self.topViewController respondsToSelector:@selector(shouldAutorotate)]) { return [self.topViewController shouldAutorotate]; } return NO; } 
  • Ahora sus viewControllers responderán respectivamente a este método.
  • Tenga en count que puede hacer lo mismo con otros methods orinetaion

También recibí el siguiente error cuando se inicia la aplicación.

"Se espera que las windows de la aplicación tengan un controller de vista raíz al final del inicio de la aplicación"

Estoy usando un UISplitViewController * splitViewController

Si es así, la forma de solucionarlo es haciendo el siguiente cambio en el file AppDelegate.m:

Reemplazar

  [self.window addSubview:[splitViewController view]]; 

Con

 [self.window setRootViewController:splitViewController]; 

Después de esto, se llamó a shouldAutoRotate y se trabajó correctamente.

Estoy usando iOS 7 pero creo que mi caso puede ser útil para otros.

Tengo una jerarquía de control de vista profunda enraizada con UITabBarController. El único lugar donde debería garantizarse que se debe llamar a autorizar está dentro del UITabBarController. Así que simplemente subclasss UITabBarController y pongo mi lógica de control de rotation dentro de mi método shouldAutorotate.

Así es como lo haría

si desea verificar cuál es la orientación actual, agregue esta línea a su file viewconrtoller.m

  #define isPortrait [[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown 

luego, donde desea verificar la orientación, escriba la condición como a continuación

 - (void)viewDidLoad { if(isPortrait) { //portrait mode.... NSLog(@"its in IsPotraitMode"); } else { //landscape mode.... NSLog(@"its in IsLandscapeMode"); } }