8

Tengo un UITabBarController presentado en modo vertical. En una de las pestañas, tengo un botón que muestra un UIViewController de forma modal (un simple script de guión gráfico realiza la acción).Modal View Force del controlador Orientación horizontal en iOS 6

Quiero que esta vista modal se muestre en modo Paisaje, pero no puedo hacer que gire automáticamente.

tengo esto en el controlador de vista modal

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

He añadido landscapeLeft a las orientaciones plist compatible (aunque esto también permite que el TabBar sea girado el que no quiero)

también he añadido esto a la viewDidLoad de la vista modal

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeLeft; 

pero simplemente no puedo conseguir que gire por sí mismo.

Gracias

EDITAR ----

Parece shouldAutoRotate ni siquiera siendo llamados!

Además, estoy tratando de detectar la orientación y este código a continuación siempre muestra 2, ¡independientemente de la orientación!

if ([[UIDevice currentDevice] orientation] == UIInterfaceOrientationPortrait) { 
     NSLog(@"1"); 
     self.hostView.frame = CGRectMake(0, 60, 200, 255); 
    } else { 
     NSLog(@"2"); 
     self.hostView.frame = CGRectMake(0, 45, 480, 255); 
    } 

EDIT 2 ---

Mi mal. Supongo que debería haber mencionado que estaba usando iOS 6. La pantalla gira automáticamente en iOS 5. shouldAutorotateToInterfaceOrientation está en desuso, así que necesito leer sobre los nuevos métodos.

+0

Desde mi experiencia previa con esto, no hay forma de forzar a que viewController aparezca en una orientación específica. Puede elegir si permite que la orientación cambie o no, pero no la fuerza. fue un fastidio para mí ... – KDaker

+0

¡Eso es un poco estúpido! Tengo un gráfico que solo cabrá en Landscape. Entonces dices que Apple quiere que lo muestre mal hasta que el usuario encienda su dispositivo. Eso no suena bien, aunque no he encontrado una solución, así que puede que tengas razón. – Darren

Respuesta

7

Notas iOS 6.0 Release
"Más responsabilidad se está moviendo a la aplicación y el delegado de la aplicación ahora. , contenedores de iOS (como UINavigationController) no consultan a sus hijos para determinar si deben autorotate. "

-(BOOL)shouldAutorotate de UIViewController en cualquier contenedor (como UINavigationController) no se llamará desde IOS6.

Intenté una solución al usar Category para agregar el método a la clase UINavigationController existente.

dentro del método shouldAutorotate, puede llamar al método shouldAutorotate en cada controlador de vista de self.viewControllers. De hecho, puede pasar a su controlador de vista hijo.

0

hago exactamente esto en mi aplicación, y lo hacen a través de shouldAutoRotateToInterfaceOrientation, de forma ligeramente diferente de lo que:

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    return (YES); 
return (NO); 
} 

para iOS 6, también debe establecer window.rootViewController = {el controlador de vista raíz}; en su delegado de la aplicación. Estoy esperando que esto es su problema

+0

Esto aún no fuerza la orientación. He agregado esto a mi AppDelegate self.window.rootViewController = [[UIStoryboard storyboardWithName: @ "MainStoryboard" paquete: [NSBundle mainBundle]] instantiateViewControllerWithIdentifier: @ "mainTab"]; – Darren

+0

ok bummer, no estoy usando storyboards en mis aplicaciones, aunque no creo que eso cause este problema. Sospecho que la propiedad rootViewController está siendo configurada automáticamente para usted. Sería interesante registrar las llamadas a shouldAutorotate para ver si incluso se llama – CSmith

+0

No, shouldAutorotate no se llama en absoluto. – Darren

1

En iOS 6 parece ser que este método puede ayudar a forzar una orientación específica en iOS 6.

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

Todavía estoy tratando de conseguir que funcione y se actualizará con cualquier hallazgo

+0

Gracias, funciona en mi caso junto con el método - (BOOL) shouldAutorotate {return NO;} – Alex

6

Si desea forzar la rotación en iOS 6, su RootViewController debe poner en práctica estos métodos:

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskLandscape; 
} 

- (BOOL)shouldAutorotate { 
    return YES; 
} 
Cuestiones relacionadas