2009-02-10 16 views
7

Tengo una aplicación basada en tabbar.Cómo rotar vista al paisaje en una aplicación tabbar

Construyo 2 vistas, una en vertical y otra en modo horizontal en Interface Builder.

Ahora, quiero algo así como la aplicación de iPod. Quiero que la vista de paisaje sea de pantalla completa y ocultar la barra de estado & en la barra de estado.

me hacen trabajar el básico de esto:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    if (self.landscape) { 
     if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
     { 
      self.view = self.portrait; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     { 
      self.view = self.landscape; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     { 
      self.view = self.landscape; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
     } 
     else 
     { 
      self.view = self.portrait; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-180)); 
     } 
    } 
} 

Pero todo el trabajo sucio. La vista del paisaje no llena correctamente el área y los controles se ubican en ubicaciones incorrectas, diferentes como diseño primero.

Además, todavía no encontré una manera de ocultar todo lo demás ...

Respuesta

1

Puede ocultar la barra de estado llamando

setStatusBarHidden:(BOOL) 

en una referencia UIApplication, como tal.

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

[application setStatusBarHidden:YES]; 

} 

para deshacerse de la barra de pestañas, se puede hacer una toma de referencia en el constructor de interfaz a su código y llamar

[myUITabBar removeFromSuperview]; 

Eso podría funcionar, aunque no lo he probado, como para el otro preguntas, no estoy al 100%, no había abordado los problemas antes.

1

Ok, esto es lo más lejos que puse esto funcione:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    if (self.landscape) { 
     if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
     { 
      self.view = self.portrait; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     { 
      self.view = self.landscape; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     { 
      self.view = self.landscape; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
     } 
     else 
     { 
      self.view = self.portrait; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-180)); 
     } 
    } 
} 

Ahora, en el AppDelegate:

- (void) didRotate:(NSNotification *)notification 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    [UIView beginAnimations:nil context:NULL]; 

    if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) 
    { 
     [tabBarController.view setAlpha:0.0]; 
     [tabBarController.view removeFromSuperview]; 

     [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    } else { 
     [tabBarController.view setAlpha:1.0]; 
     [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];  
    } 
    [UIView commitAnimations]; 
} 

Pero entonces, ¿cómo ajustar la vista actual y cómo restaurar la barra de pestañas?

1

Cuando miro la aplicación iPod, me parece que la vista TabBarController no se reemplaza o modifica de ninguna manera. Creo que solo hay una transición de fundido entre la vista tabbarcontroller y la vista de flujo de cobertura.

Si yo fuera usted, intentaría (no estoy seguro si esto podría funcionar) con un controlador de flujo de cobertura, con su vista mostrada en la parte superior de la vista de tabBarController. Si impidiera que tabBarController autorizase su vista, en ese momento desaparecería su vista y se desvanecería en la vista de flujo de cobertura, que sería solo horizontal.

No sé si el statusBar tendría un comportamiento correcto, y dejé muchos detalles para que los resuelvan, pero en cualquier caso, creo que sería una buena idea tener dos controladores separados, uno mostró en paisaje, el otro (el tabBar) en retrato.

Espero que te ayude.

1

Parece que hay un buen número de programadores que desean tener un elemento de barra de pestañas para llevarlos a una vista panorámica de pantalla completa (sin barra de estado, sin barra de pestañas) y luego regresar.

He publicado una consulta sobre si esto es posible en el foro de desarrolladores de Apple, pero aún no he recibido una respuesta.

¿Por qué es tan difícil? (Lo siento, ¿una pregunta para novatos? Parece que algunas cosas bastante obvias no deberían ser difíciles) Nadie que he encontrado aún en línea tiene una respuesta clara a esto.

5

Mire el código de muestra "AlternateViews" de Apple.

La idea básica es que puede detectar la orientación física del dispositivo con notificaciones, y luego activar un nuevo controlador de vista "modalmente" y pedirle que solicite la pantalla completa. Deshabilita la rotación de la interfaz al tener shouldAutorotate ... devuelve SÍ solo para una orientación, ya que está haciendo todo esto manualmente con las notificaciones. Cuando cambia la orientación física, su controlador de vista modal se presenta o descarta.

+0

¡Gracias por esto! – mobius

Cuestiones relacionadas