2012-09-23 26 views
10

Tengo una aplicación donde tengo una subclase UINavigationController como mi rootViewController. Tengo un UITableViewController que permite al usuario editar algunas configuraciones, siempre debe estar en modo retrato. Mi aplicación también necesita admitir todas las demás orientaciones después de insertar un componente MoviePlayer en el controlador de navegación.iOS 6 auto rotación problema - supportedInterfaceOrientations valor devuelto no respetado

El UITableViewController subclase tiene esta implementación de supportedInterfaceOrientations:

- (NSUInteger)supportedInterfaceOrientations { 
    LLog(); 
    return UIInterfaceOrientationMaskPortrait; 
} 

El comando de registro me dice que esto se llama en realidad.

El problema es que no se respeta el valor de retorno, es decir, la pantalla cambia a orientación horizontal cuando enciendo el dispositivo.

¿Qué puedo hacer para que la vista de configuración siempre se muestre en vertical pero permita cambios de orientación para el visor de video?

Más información: mi subclase UINavigationController no anula shouldAutorotate o supportedInterfaceOrientations. No he implementado

- (NSUInteger)application:(UIApplication *)application 

supportedInterfaceOrientationsForWindow:(UIWindow *)window 

método en mi AppDelegate y he permitido que todas las orientaciones en el resumen objetivo.

Respuesta

17

Tuve el problema de que ViewControllers en la pila de navegación admite todas las orientaciones, algunos solo retrato, pero el controlador UINavigation devolvía todas las orientaciones compatibles con la aplicación, este pequeño truco me ayudó.

@implementation UINavigationController (iOS6OrientationFix) 

-(NSUInteger) supportedInterfaceOrientations { 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
+0

Esto es definitivamente una solución creativa, pero no puedo creer que esto es lo que Apple espera que hagamos. Tengo problemas para entender su nuevo esquema de autorrotación. Dicen las reglas de ViewController de pantalla completa superior. Pero, como está señalando, el ViewController de pantalla completa superior es en muchos casos el NavigationController. ¿Se supone que debemos subclasificarlo o crear una categoría para implementar el mensaje supportedInterfaceOrientations? No se siente bien – eddy

+0

No me parece correcto, quizás solo sea un error en la implementación de Apple. – Mindaugas

+0

Esto no funciona para mí. También intenté crear subclases, ya que las categorías no aseguran que se anule el método :( – Pacu

2

también hay que añadir:

- (BOOL)shouldAutorotate { 
    return NO; 
} 

y establecer las rotaciones soportados para la raíz del controlador de vista en el archivo plist aplicación sólo portrait.

2

Categoría de UINavigationController no funciona para mí. No sé por qué. Resuelvo mi problema con esa categoría de UIViewController:

@implementation UIViewController (Orientation) 

- (BOOL) shouldAutorotate 
{ 
    return YES; 
} 


- (NSUInteger)supportedInterfaceOrientations 
{ 
    NSUInteger orientations = UIInterfaceOrientationMaskPortrait; 

    if ([self isKindOfClass:[PlayerViewController class]]) 
    { 

     orientations |= UIInterfaceOrientationMaskLandscapeLeft; 
     orientations |= UIInterfaceOrientationMaskLandscapeRight; 

    } 

    return orientations; 
} 

@end 
Cuestiones relacionadas