iOS 6 shouldAutorotate: NO se llama


He estado buscando en Internet una solución para esto, pero no estoy encontrando nada. Estoy tratando de hacer que mi aplicación iOS 5 iOS 6 compatible. No puedo hacer que las cosas de orientación funcionen bien. Soy incapaz de detectar cuando una rotación está a punto de suceder. 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 supportedInterfaceOrientation: se llama muy bien. El método shouldAutorotate, sin embargo, no se disparará. Necesito hacer un intercambio de imágenes en rotar, pero no puedo obtener ninguna indicación de que una rotación está a punto de ocurrir.

Gracias de antemano.

Author: enagra, 2012-10-08

8 answers

Ver si está recibiendo el siguiente error cuando se inicia la aplicación.

Se espera que las ventanas de la aplicación tengan un controlador de vista raíz al final del inicio de la aplicación

Si es así, la forma de solucionarlo es haciendo el siguiente cambio en el archivo AppDelegate.m (aunque parece haber una serie de respuestas para solucionar esto):

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

// With
[self.window setRootViewController:navigationController];  //NEW

Después de esto shouldAutoRotate debe ser llamado correctamente.

 80
Author: user1672376,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 15:10:58

Cuando utilizo UINavigationController como base para una aplicación utilizo la siguiente subclase para darme la flexibilidad de permitir que el viewcontroller más hijo decida sobre la rotación.

@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
 44
Author: Mike Pollard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 08:27:34

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

El método should rotate to orientation (a diferencia de shouldAutorotate) está en desuso y ya no se llamará a partir de iOS 6, pero no estaba destinado a usarse de la forma en que lo estaba usando de todos modos.

EDITAR Respuesta a los votos negativos repetidos. Por favor, explique por qué el uso del método que he indicado no es una (para citar OP) "indicación de que una rotación está a punto de ocurrir."El contenido de la la pregunta y el título no coinciden.

 15
Author: borrrden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 08:10:31

Parece que en iOS 6 el controlador de navegación del contenedor no consulta los controladores de vista secundarios al rotar:

En Notas de la versión de iOS 6 :

Ahora, los contenedores iOS (como UINavigationController) no consultan sus hijos para determinar si deben autorotar. Por por defecto, una aplicación y una interfaz compatible con view controller las orientaciones se establecen en UIInterfaceOrientationMaskAll para el iPad idioma y UIInterfaceOrientationMaskAllButUpsideDown para el iPhone modismo.

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

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

En el primer caso todo se decide en el controlador de navegación personalizado por la combinación de shouldAutorotate y supportedInterfaceOrientations dado que supportedInterfaceOrientations está de acuerdo con las orientaciones soportadas de la aplicación.

En el segundo caso, incluso si el supportedInterfaceOrientations del controlador de vista personalizado es llamado por el UIPageViewController, el valor devuelto no se toma en consideración. Funciona si los dos métodos se sobrescriben en una subclase del controlador UIPageViewController. No estoy seguro de los efectos secundarios de eso, ya que se supone que esta clase no debe ser subclase.

 10
Author: Adrian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-26 08:20:33

Si su viewController es un hijo viewController en un UINavigationController entonces puede hacer lo siguiente:

  • Subclase UINavigationController
  • anular shouldAutoRotate en su subclase
  • envíe su topViewController este mensaje cuando se llame a este método

/ / Este Método está dentro de su subclase UINavigationController

- (BOOL)shouldAutorotate
{
    if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
    {
        return [self.topViewController shouldAutorotate];
    }
    return NO;
}
  • Ahora sus ViewController responderán respectivamente a este método.
  • Tenga en cuenta que puede hacer lo mismo con otros métodos de orinetaion
 10
Author: Basheer_CAD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-20 20:00:07

También estaba recibiendo el siguiente error cuando se inicia la aplicación.

"Se espera que las ventanas de la aplicación tengan un controlador 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 AppDelegate.archivo m:

Sustitúyase

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

Con

[self.window setRootViewController:splitViewController];

Después de esto shouldAutoRotate fue llamado y funcionó correctamente.

 1
Author: Michael Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-28 22:04:03

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

Tengo una jerarquía de controladores de vista profunda arraigada con UITabBarController. El único lugar donde shouldAutorotate está garantizado para ser llamado es dentro del UITabBarController. Así que simplemente subclase UITabBarController y pongo mi lógica de control de rotación dentro de mi método shouldAutorotate.

 1
Author: Donald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 14:00:21

Así es como lo haría

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

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

Luego ,donde desee 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");
        }
}
 0
Author: Sam B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 13:16:36