2010-01-27 13 views
10

Tengo una aplicación basada en navegación en la que me gustaría que solo uno de los controladores de vista admita la orientación horizontal. Para ese viewcontroller (vc1), en shouldAutorotate, estoy devolviendo SÍ para todas las orientaciones y en los otros controladores estoy devolviendo SÍ solo para modo retratoiPhone: permite la orientación horizontal en solo un controlador de vista

Pero incluso entonces si el dispositivo está en modo horizontal y voy al siguiente pantalla desde vc1, la siguiente pantalla también aparece rotada en modo horizontal. Supuse que si devolvía un SÍ solo para el modo vertical, la pantalla debería aparecer solo en vertical.

¿Es este el comportamiento esperado? ¿Cómo logro lo que estoy buscando?

Gracias.

+0

Posible duplicado: http://stackoverflow.com/questions/181780/is-there-a-documented-way-to-set-the-iphone-orientation –

+0

No quiero para establecer el orientación. Solo quiero que una de las vistas no responda a los cambios de orientación. – lostInTransit

+0

pregunta similar también está en http://stackoverflow.com/questions/2041884/problem-with-uiviewcontroller-orientation/2042040#2042040 pero no se han agregado respuestas. –

Respuesta

24

No se puede admitir la orientación horizontal solo para uno de los controladores de vista si usa shouldAutorotateToInterfaceOrientation método de UIViewController.
Tiene solo dos opciones si todos los controladores de vista admiten el panorama o si los controladores de vista no lo admiten.

Si desea admitir el panorama solo para uno, debe detectar la rotación del dispositivo y girar manualmente las vistas en el controlador de visualización.
Puede detectar la rotación del dispositivo mediante Notificación.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didRotate:) 
              name:UIDeviceOrientationDidChangeNotification 
              object:nil]; 

A continuación, puede girar sus puntos de vista cuando se detecta la rotación del dispositivo.

- (void)didRotate:(NSNotification *)notification { 
    UIDeviceOrientation orientation = [[notification object] orientation]; 

    if (orientation == UIDeviceOrientationLandscapeLeft) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI/2.0)]; 
    } else if (orientation == UIDeviceOrientationLandscapeRight) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)]; 
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI)]; 
    } else if (orientation == UIDeviceOrientationPortrait) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(0.0)]; 
    } 
} 
+1

esto lo que necesitaba exactamente ¿me puede decir cómo puedo rotar el UIToolBar y UINavigationBar – Sam

+0

muy útil! .. – Ahsan

+1

Esto funcionó como un encanto. ¿Pero todavía hay un problema con la barra de estado? ¿Cómo puedo rotarlo con la orientación del dispositivo? –

5

También tengo la situación cuando necesito todos los controladores de vista en modo retrato, pero uno de ellos también puede girar al modo horizontal. Y este controlador de vista tiene barra de navegación.

Para este propósito, he creado una segunda ventana, en mi caso era el controlador de vista de cámara. Y cuando necesito mostrar el controlador de vista de cámara, muestro la ventana de la cámara y me escondo cuando necesito presionar otro controlador de vista.

Y también necesita agregar este código a AppDelegate.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if (window == self.cameraWindow) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 

    return UIInterfaceOrientationMaskPortrait; 
} 
Cuestiones relacionadas