2012-09-21 69 views
11

En iOS 5, mi aplicación utiliza el método de cambiar mi orientación:supportedInterfaceOrientations no funciona en iOS 6 UIViewController

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

En iOS 6 Creo que tengo que hacer esto, pero no hace nada! Mi aplicación se rota no de la manera que quiero que sea.

- (BOOL) shouldAutorotate 
{ 
    return YES; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeRight; 
} 

Respuesta

28

Es la forma en que estaba añadiendo mi viewController.

que sustituyen este código de línea:

[window addSubview:viewController.view]; 

por esta línea:

[window setRootViewController:viewController]; 
+1

Estaba volviendo loco, ¡gracias por esto! Alguna idea cuando esto cambio? Mi base de código tiene más de 2 años y es probablemente una de las primeras líneas de código que he escrito en Objective-c. – Slee

+0

esto funciona para el controlador de vista raíz, pero no para los controladores de subvista con I pushViewController, ¿alguna sugerencia? – phil88530

+0

¡Acepte la respuesta! Me funcionó :) Suponiendo que hayas agregado los métodos en tu pregunta a cada uno de ellos, ¿has intentado agregar 'preferredInterfaceOrientationForPresentation' también? – SpacyRicochet

2

Para mí la solución funcionó, el caso fue un poco diferente, porque tenía un UINavigationController. Mi caso era que necesitaba todas las ventanas de retrato excepto una. Tuve que habilitar todas las orientaciones de paisaje y de retrato en los objetivos (de lo contrario, se bloquea en la única vista de paisaje).

Así que en este caso:

  1. crear una subclase de UINavigationController,
  2. insertar el material rotationspecific no
  3. y utilizar la subclase en lugar de UINavigationController.
+0

Se podría argumentar que la documentación de Apple no está actualizada (sorprendente), pero la documentación de UINavigationController indica: 'Esta clase no está destinada a subclases' (http://developer.apple.com/library/ios/#documentation /uikit/reference/UINavigationController_Class/Reference/Reference.html). – Daniel

+0

FWIW, a partir de iOS 6 (y posterior), puede subclase UINavigationController. – hsoi

15

Cuando el dispositivo cambia de orientación, en iOS 6, el sistema pregunta a la aplicación qué orientación admite. La aplicación devolverá una serie de orientaciones que acepta.

¿Cómo determina la aplicación su orientación?

  1. comprueba en primer lugar la aplicación es orientaciones Info.plist (esto es muy importante para determinar qué orientación utilizar para el lanzamiento.
  2. En segundo lugar se pide es delegado solicitud de que es orientaciones, esto puede especificarse mediante la -(NSUInteger)application:supportedInterfaceOrientationsForWindow: método. Esto anula la configuración de info.plist, esta implementación es opcional. De forma predeterminada, las aplicaciones de iPad se orientan en todas las direcciones y el iPhone está en su totalidad.
  3. Por último, el delegado de la aplicación consulta su controlador de vista superior, esto puede ser UINavigationController o UIViewController ... etc, luego especifica h Deberá presentarse y si quiere autorrotar. Estos UIViewControllers pueden usar los métodos shouldAutorotate: y supportedInterfaceOrientations para indicar al delegado de la aplicación cómo presentarlo.

Debe asegurarse de configurar el controlador de la vista raíz de su ventana.

Además, si presenta otros controles de vista en pantalla completa, como un controlador de vista modal, este es el responsable de determinar los cambios de orientación o no.

+0

big +1 para el método ApplicationDelegate de 'application: supportedInterfaceOrientationsForWindow' – theiOSDude

0

Creé una nueva variable en mi singleton: canRotate, y la configuré en SÍ cuando quiero que el controlador de vista admita cierta orientación.

En AppDelegate que añade esto:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if([[SharedData sharedInstance] canRotate]) 
    { 
     return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight); 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

en mi caso funciona. Tengo una barra de pestañas personalizada y UINavigationviewControllers se agregan como subvistas a rootViewController.

0

Sé que esto suena bastante elemental, pero me estaba agotando el cerebro para resolver problemas de orientación mientras probaba en mi iPhone - Tenía el modo de bloqueo automático en modo Retrato - por lo que nada cambié programáticamente importó - pensó que esto debería ser solución de problemas paso número 1!

1

Si está utilizando un UINavigationController, envía el mensaje supportedInterfaceOrientations: al propio UINavigationController en lugar de al controlador de vista superior (es decir, lo que realmente desea que haga).

En lugar de tener que subclase UINavigationController para solucionarlo, puede simplemente add a category to UINavigationController.

Cuestiones relacionadas