ios ipad ios6 modalviewcontroller uiinterfaceorientation

ios - Mantener la orientación de la vista principal después de la vista modal se ha presentado con diferente orientación



ipad ios6 (1)

Creo que el problema es su uso de la application:supportedInterfaceOrientationsForWindow: En su lugar, deshágase de eso y comience con una subclase UINavigationController y conviértala en la clase del controlador de vista raíz que es su interfaz de navegación. Entonces:

  • En la subclase UINavigationController, devuelve UIInterfaceOrientationMaskLandscape de supportedInterfaceOrientations .

  • En el controlador de vista presentado (modal), devuelva UIInterfaceOrientationMaskAll de supportedInterfaceOrientations .

Así que estoy desarrollando una aplicación para iPad que solo admita el modo apaisado, excepto en un controlador de vista modal. El problema que estoy teniendo es que una vez que presento la vista modal y cambio la orientación a vertical, luego desactivo la vista, la vista principal (que solo admite el paisaje) está en modo vertical hasta que gire el dispositivo en el que luego vuelve a paisaje y se queda de esa manera. Me he estado golpeando tratando de descubrir cómo mantener a los padres viendo la orientación original, pero no he podido encontrar una solución.

Tengo el siguiente código en mi delegado de aplicación para permitir cambios de orientación solo en esa vista modal única (GalleryPhotoViewer):

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; if(self.window.rootViewController){ UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; //Support Portrait mode only on Photoviewer if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class] ) { orientations = UIInterfaceOrientationMaskAll; }else{ orientations = [presentedViewController supportedInterfaceOrientations]; } } return orientations; }

Desde la clase principal (PhotosViewController) estoy llamando:

GalleryPhotoViewController *gpView = [GalleryPhotoViewController new]; [self presentViewController:gpView animated:YES completion:nil];

También en mi padre (y otras vistas) tengo el siguiente código para no permitir el modo vertical:

- (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if(interfaceOrientation == UIInterfaceOrientationPortrait) { return YES; } else { return NO; } }

¿Alguna idea sobre cómo puedo mantener la orientación en mi vista de padres? Estaba pensando en posiblemente simplemente cambiando la orientación de forma programática en el padre en el método viewWillAppear una vez que se descarta el modal, pero entonces no sabría cuál era la orientación anterior, sin mencionar que no he podido encontrar el código para hacer esto. independientemente de ios6.

EDITAR / SOLUCIÓN: Encontré una solución y lo que terminé haciendo fue dejar la aplicación: supportedInterfaceOrientationsForWindow: code y simplemente agregué la subclase UINavigation a la vista principal que presentaba la vista modal y todo funcionó como se esperaba y el padre retuvo su original orientación mientras que el modal pudo cambiar libremente.

En mi padre:

//To make sure that this view remains in Landscape @implementation UINavigationController (Rotation_IOS6) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } @end

Gracias @matt por las sugerencias.