2012-10-04 38 views
6

Quiero admitir la rotación de iOS 6. El problema es que he estado revisando una gran cantidad de documentación y apilando preguntas de desbordamiento, pero no he encontrado soluciones ni siquiera ligeramente profundas. Sólo he visto que debo añadir estos dos métodos para mis clases de vista del controlador - sin embargo, si no estoy equivocado, que no operan de la misma forma que el IOS 6 pre métodos:iOS 6 Rotación: presionando un controlador de vista

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAll; // use what is appropriate for you. 
} 

Mi la aplicación actualmente rota en pre-iOS6 usando el siguiente código. Tenga en cuenta que utilizo los parámetros de orientación de la interfaz para determinar si voy a presionar o no mi vista Controlador. ¿Cómo implemento esto en los delegados de rotación de iOS 6?

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    UIInterfaceOrientation toOrientation = self.interfaceOrientation; 

    if (self.tabBarController.view.subviews.count >= 2) 
    { 
     UIView *tabBar = [self.tabBarController.view.subviews objectAtIndex:1]; 

     if(toOrientation != UIInterfaceOrientationLandscapeLeft && toOrientation != UIInterfaceOrientationLandscapeRight) 
     { 
      CUSTOM_DEBUG_LOG("\n\nRotated back to Portrait"); 
      tabBar.hidden = FALSE; 
     } 
    } 
} 

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     CUSTOM_DEBUG_LOG("\nView going landscape"); 
     ScrollViewController *s = [[ScrollViewController alloc] initWithNibName:@"ScrollViewController" bundle:nil]; 
     [self.navigationController pushViewController:s animated:NO]; 
     [s release]; 
     self.tabBarController.tabBar.hidden = YES; 
     self.navigationController.navigationBar.hidden = YES; 
    } 

} 
+1

Mire la película WWDC 2012 sobre los controladores de vista. – matt

+0

Creo que no formulé correctamente mi pregunta, porque mi aplicación funciona sin ninguna de las respuestas aquí. Básicamente no pude hacer que la rotación funcionara en iOS y pensé que las funciones willAnimate ... también estaban en desuso. Resulta que no lo son. Entonces mi aplicación todavía funciona. ¿Hurra? Lamentablemente, tengo barras blancas antiestéticas gigantescas en mi página de las que necesito deshacerme. Hora de publicar otra pregunta. –

Respuesta

3

Pedido this y this SO discusión.

[EDIT]

Si los métodos que usted ha mencionado no están en desuso en IOS 6.0 y van a seguir trabajando. Es solo la forma en que funciona la rotación automática. Hasta ahora, era responsabilidad de los controladores ver si rotan o no, pero ahora RootViewController decidirá si sus hijos deberían rotar o no. Si no tiene la configuración de rootviewcontroller, debe agregarla a la ventana y luego colocar los métodos shouldAutoRotate y supportedInterfaceOrientations en el controlador de visualización de la raíz.

+0

Si no me equivoco, parece que está sacando el código de mi función willAnimate a otra función, que se ve mejor pero funcionalmente no hace nada más. –

+0

Lamento no haber entendido bien su pregunta. Editado mi respuesta. – applefreak

+0

¡Lo tomaré! Gracias :) –

3

padres Vistas ahora manejan rotación en 6. Esquema general de los controladores de navegación iOS y añadir un bool

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; // your rotation here 
} 
+0

No estoy seguro de haberlo entendido. ¿Podrías darme un fragmento de código de muestra o mostrarme cómo lidiaría con empujar mis controles de vista? Literalmente solo pegaste el primer bloque de código (con un rendimiento ligeramente diferente) y eso no me ayuda para nada. Debo mencionar que la razón por la que estoy presionando un controlador de vista separado para el modo horizontal es porque la interfaz de usuario horizontal es completamente diferente del retrato. –

+1

Es posible que desee volver a escribir ese código para que simplemente cambie el diseño en una rotación. Si la interfaz de usuario diferente tiene los mismos componentes, sería sencillo.Si hay diferentes componentes, entonces puede mostrar/ocultar adecuadamente. Si realmente desea mantener controladores de vista separados, entonces probablemente funcionaría mejor si hubiera un controlador de vista padre que añadiera/eliminara y/o mostrara/ocultara el controlador de vista secundario apropiado en una rotación ... de esa manera usted no tiene que lidiar con la funcionalidad detrás de escena de empujar/hacer estallar los controladores de vista en una rotación. – Matt

+0

¿Hacer push/popping es ineficiente o algo altamente indeseable? La aplicación es muy similar a la aplicación de música del iPhone, donde si te inclinas hacia los lados en cualquiera de los controles de vista de la barra de pestañas (sí, mi aplicación tiene una barra de pestañas), te lanzan al flujo de cobertura. Para mi aplicación, te lanzan a un controlador de vista de mi paisaje. Parece funcionar bien para iOS 5 y versiones posteriores, pero estoy tratando de resolver las cosas para iOS 6. También debo mantener la compatibilidad con las versiones anteriores de iOS. –

1

Puede que no haya implementado el código de rotación iOS6 correctamente cuando publiqué la pregunta por primera vez.

Pensé incorrectamente que la función willAnimateRotationToInterfaceOrientation estaba obsoleta en iOS6, lo que me hizo pensar que había un nuevo delegado de rotación de iOS con un parámetro de orientación. Resulta que este no es el caso, por lo que mi aplicación funciona.

El código que he conectado mi aplicación fue sólo esto:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight); 
} 
+0

+1 para la capacidad de "copiar y pegar". No tenía ganas de buscar la sintaxis de fusión de máscara de orientación ... –

+2

El valor de conveniencia UIInterfaceOrientationMaskAllButUpsideDown es aún más legible. – eclux

1

Si está utilizando un UINavigationController, anular shouldAutomaticallyForwardRotationMethods = YES propiedad.

Luego, como dijo Mark S, también anular shouldAutorotate y supportedInterfaceOrientations para los niños VCs.

+0

¡Agradable! Buena atrapada. Te daré una barca ( –

Cuestiones relacionadas