iphone - una - iOS 6 shouldAutorotate: NO se está llamando
qué es eso de anunciar llamadas en el iphone (8)
He estado buscando en Internet una solución a esto, pero no encuentro nada. Estoy tratando de hacer que mi iOS 5 app iOS 6 sea compatible. No puedo hacer que la orientación funcione correctamente. No puedo detectar cuándo va a suceder una rotación. 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 activará. Necesito hacer un intercambio de imágenes al rotar, pero no puedo obtener ninguna indicación de que vaya a ocurrir una rotación.
Gracias por adelantado.
Así es como lo haría
si desea verificar cuál es la orientación actual, agregue esta línea a su archivo viewconrtoller.m
#define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown
luego, donde quiera verificar la orientación, escriba las condiciones como a continuación
- (void)viewDidLoad
{
if(isPortrait)
{
//portrait mode....
NSLog(@"its in IsPotraitMode");
}
else
{
//landscape mode....
NSLog(@"its in IsLandscapeMode");
}
}
Cuando uso UINavigationController como base para una aplicación, utilizo la siguiente subclase para darme la flexibilidad de permitir que el controlador de vista hijo más alto 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
Ese método no es la forma correcta de determinar eso. El método correcto es willRotateToInterfaceOrientation:duration:
El método de rotación debe orientarse (en lugar de shouldAutorotate) está en desuso y ya no se llamará a partir de iOS 6, pero no fue diseñado para ser utilizado de la misma manera que lo estaba usando.
EDITAR Respuesta a votos abajo repetidos. Explique por qué utilizar el método que indiqué no es una indicación (por citar OP) de que está a punto de producirse una rotación. El contenido de la pregunta y el título no coinciden.
Estoy usando iOS 7 pero creo que mi caso puede ser útil para otros.
Tengo una jerarquía de controlador de vista profunda enraizada con UITabBarController. El único lugar donde se garantiza que se llamará a Authorotate está dentro del UITabBarController. Así que simplemente subclasifico UITabBarController y pongo mi lógica de control de rotación dentro de mi método shouldAutorotate.
Parece que en iOS 6 el controlador de navegación de contenedores no consulta los controladores de vista infantil al rotar:
en iOS 6 notas de la versión :
Ahora, los contenedores iOS (como UINavigationController) no consultan a sus hijos para determinar si deben autorrotar. De forma predeterminada, las orientaciones de interfaz admitidas por una aplicación y un controlador de vista están configuradas en UIInterfaceOrientationMaskAll para el idioma del iPad y UIInterfaceOrientationMaskAllButUpsideDown para el idioma del iPhone.
Este comportamiento es fácil de probar. Lo que hice fue usar el mismo controlador de vista personalizada
- primer caso como controlador de vista principal
- segundo caso como hijo de un UIPageViewController
En el primer caso, todo se decide en el controlador de navegación personalizado mediante la combinación de shouldAutorotate
y supportedInterfaceOrientations
dado que supportedInterfaceOrientations
coincide con las orientaciones admitidas de la aplicación.
En el segundo caso, incluso si el UIPageViewController llama a las Orientaciones de Interfaz supportedInterfaceOrientations
del controlador de vista personalizado, el valor de retorno no se tiene en cuenta. Funciona si los dos métodos se sobrescriben en una subclase del UIPageViewController. No estoy seguro de los efectos secundarios de eso, ya que no se supone que esta clase deba ser subclasificada.
Si su viewController
es un niño viewController
en un UINavigationController
entonces puede hacer lo siguiente:
- Subclase
UINavigationController
- la anulación
shouldAutoRotate
en su subclase - envíe su
topViewController
este mensaje cuando se llame a este método
// Este método está dentro de tu subclase UINavigationController
- (BOOL)shouldAutorotate
{
if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
{
return [self.topViewController shouldAutorotate];
}
return NO;
}
- Ahora su viewControllers responderá respectivamente a este método.
- Tenga en cuenta que puede hacer lo mismo con otros métodos de orinetaion
También recibí el siguiente error cuando se inicia su aplicación.
"Se espera que las ventanas de aplicaciones tengan un controlador de vista raíz al final del lanzamiento de la aplicación"
Estoy usando un UISplitViewController * splitViewController
Si es así, la forma de solucionarlo es haciendo el siguiente cambio en el archivo AppDelegate.m:
Reemplazar
[self.window addSubview:[splitViewController view]];
Con
[self.window setRootViewController:splitViewController];
Después de esto, se shouldAutoRotate
llamar a shouldAutoRotate
y funciona correctamente.
Vea si está recibiendo el siguiente error cuando se inicia su aplicación.
Se espera que las ventanas de aplicaciones tengan un controlador de vista raíz al final del lanzamiento de la aplicación
Si es así, la forma de solucionarlo es realizando el siguiente cambio en el archivo AppDelegate.m
(aunque parece que hay varias respuestas sobre cómo solucionarlo):
// Replace
[self.window addSubview:[navigationController view]]; //OLD
// With
[self.window setRootViewController:navigationController]; //NEW
Después de esto shouldAutoRotate
debe llamarse correctamente.