2012-09-24 31 views
14

estoy usando el códigopresentViewController no apoyar la orientación en IOS 6

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) 
    { 
     [self presentViewController:navigationControllerCustom animated:YES completion:nil]; 
    } 
    else 
    { 
     [self presentModalViewController:navigationControllerCustom animated:YES]; 
    } 

Mi aplicación tiene dos Retrato Retrato orientación y al revés. Este código funciona bien con iOS 5.1, pero la orientación no funciona en iOS 6

También he añadido este código en mi clase navigationControllerCustom

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); 
} 

me puede ayudar a resolver este problema.

Gracias de antemano.

+2

he tenido el mismo problema en mis aplicaciones que he compilado para iOS 6; todas las orientaciones funcionan, excepto UIInterfaceOrientationPortraitUpsideDown; es raro. – MrJre

+0

@MrJre Cualquier solución igual es realmente extraña. –

Respuesta

25

Debe incluir esta en ti delegado aplicación:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

También asegúrese de que el controlador de vista de ambos tienen la siguiente, me da buenos resultados.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

La documentación también se dice que UINavigationController's no consulta su parte superior Vista Controlador de orientaciones compatibles, aunque un Apple ingeniero Más en los Foros de desarrolladores lo dijo ... parece que no lo hace. Por lo tanto usted debe agregar una categoría para UINavigationController, este es el que yo uso:

#import "UINavigationController+autorotate.h" 

@implementation UINavigationController (autorotate) 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

@end 

Para obtener más información de cómo funciona Autorotar en IOS 6 check out this answer

+0

Respuesta perfecta, usted resolvió mi problema, Gracias :-) –

+1

La categoría UINavigationController fue suficiente. – Gujamin

+0

+1 La porción delegada de la aplicación fue muy útil. –

2

se le olvidó:

- (BOOL)shouldAutorotate { 
    return YES; 
} 
+0

Gracias por su respuesta. Añadí, pero no funciona, cualquier otra cosa que me falta. –

+0

En su Info.plist, bajo orientaciones de interfaz admitidas, ¿tiene el retrato y el retrato al revés? – rocky

+0

Sí, también he hecho eso, ¿alguna otra cosa? –

1

Simplemente copia pasta que los anteriores fragmentos, su código

@implementation UINavigationController (rotation) 
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers. 
- (NSUInteger)supportedInterfaceOrientations { 
return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
1

Si planea habilitar o deshabilitar la rotación para todos los controladores de vista, no necesita subclase UINavigationController. En su lugar use:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

en su AppDelegate.

Si va a apoyar todas las orientaciones en su aplicación, pero en diferentes orientaciones principal Ver los controladores (UINavigationController pila, por ejemplo) se debe utilizar

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

en combinación con los métodos siguientes en el Padre Vista Controlador.

- (BOOL)shouldAutorotate 

y

- (NSUInteger)supportedInterfaceOrientations 

Pero si va a tener diferentes valores de orientación de diferentes ViewControllers niños en la misma pila de navegación (como yo) es necesario comprobar la ViewController actual en la pila de navegación.

He creado el siguiente en mi UINavigationController subclase:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    int interfaceOrientation = 0; 

    if (self.viewControllers.count > 0) 
    { 
     id viewController; 
     DLog(@"%@", self.viewControllers); 
     for (viewController in self.viewControllers) 
     { 
      if ([viewController isKindOfClass:([InitialUseViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else if ([viewController isKindOfClass:([MainViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown; 
      } 
     } 
    } 
    return interfaceOrientation; 
} 

Puesto que no puede controlar más de niños ViewControllers la configuración de rotación de controlador de vista presentado que de alguna manera debe interceptar lo controlador de vista se encuentra actualmente en la pila de navegación . Entonces eso es lo que hice :). Espero que ayude !

+0

Gracias @codeFi, sus sugerencias arreglaron mis problemas. He estado luchando bastante al migrar de iOS5 a iOS6 con los diversos problemas de orientación del dispositivo. ¡Tu haces mi día! –

1

Subclase UINavigationController y anular la shouldAutorotate y supportedInterfaceOrientations así:

-(BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 

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

Y ahora usted puede controlar su orientación es cada ViewController. Simplemente anule los dos métodos en cada ViewController.

Cuestiones relacionadas