Obtener la orientación de la interfaz del dispositivo en viewWillAppear

Necesito obtener la orientación de la interfaz en el método viewWillAppear de mi UIViewController. Lo que hice es:

if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
   NSLog(@"Portrait");
else
   NSLog(@"Landscape");

Cuando estoy en paisaje, siempre obtengo Vertical en viewWillAppear y Landscape en viewDidAppear. ¿Por qué?

Entonces, intenté usar [[UIApplication sharedApplication] statusBarOrientation], pero sucede lo mismo. También probé otra solución publicada aquí en Stack Overflow:

UIDevice* device = [UIDevice currentDevice];
[device beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation currentOrientation = device.orientation;
[device endGeneratingDeviceOrientationNotifications];

Esto parece devolver correctamente la orientación, pero ahora me queda el problema de mapear UIDeviceOrientation a UIInterfaceOrientation, que no es posible hasta donde yo sé (no se pueden mapear boca arriba y boca abajo).

¿Alguna solución a este problema?

preguntado el 04 de julio de 12 a las 09:07

Si puede admitir iOS 5+, es mejor hacer este trabajo en el método -viewWillLayoutSubviews. Si su aplicación acaba de terminar de cargarse, se puede llamar a -viewWillAppear antes de que se configure el marco de vistas y la ventana haya terminado de orientarse. Si necesita esa información en iOS 4, realmente necesita esperar a que se llame a -viewDidAppear. -

Si está utilizando un controlador de navegación, ¿qué hay de verificar self.navigationController.interfaceOrientation en viewWillAppear? -

@JasonCoco Eso funciona perfectamente para mí. Sería interesante encontrar una solución para iOS4 también, pero eso es bueno. -

@AntonHolmquist También lo intenté, olvidé mencionarlo. Todavía estoy recibiendo siempre retrato. ¿no es así? -

@JasonCoco Si responde a la pregunta con la información que proporcionó en el comentario, lo marcaré como aceptado. Esa es la única opción de trabajo proporcionada hasta ahora. -

2 Respuestas

Utilice [UIApplication sharedApplication].statusBarOrientation en su lugar.

if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    // Portrait
}
if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight){
    // Landscape
}

Respondido 04 Jul 12, 09:07

Como dije, probé esto. Siempre obteniendo retrato. ¿Esto funciona para ti? - luca carlon

El primer comentario de JasonCoco es la mejor solución que encontré para este problema.

Respondido 26 Oct 12, 18:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.