Cómo rotar la vista al paisaje en una aplicación tabbar

votos
7

Tengo una aplicación basada en tabbar.

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

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

Hago funcionar 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 funciona 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é la manera de ocultar todo lo demás ...

Publicado el 10/02/2009 a las 22:59
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
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.

Respondida el 30/11/2009 a las 01:47
fuente por usuario

votos
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 esto 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.

Respondida el 15/11/2009 a las 02:21
fuente por usuario

votos
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 tú, intentaría (no estoy seguro de 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 adecuado, y dejé muchos detalles para que los resuelvan, pero en cualquier caso, creo que sería una buena idea tener dos controladores separados, uno mostrado en el paisaje, el otro (el tabBar) en el retrato.

Espero que te ayude.

Respondida el 14/11/2009 a las 10:24
fuente por usuario

votos
1

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

- (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 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, ¿cómo establecer la vista actual y cómo restaurar la barra de pestañas?

Respondida el 11/02/2009 a las 21:23
fuente por usuario

votos
1

Puede ocultar la barra de estado llamando

setStatusBarHidden:(BOOL)

en una referencia de aplicación UIA, como tal.

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

[application setStatusBarHidden:YES];

}

Para deshacerse de la barra de tabulación, puede hacer una salida de referencia en el constructor de Interfaz para su código y llamada

[myUITabBar removeFromSuperview];

Eso podría funcionar, aunque no lo he probado, en cuanto a las otras preguntas, no estoy al 100%, ya que no he abordado los problemas antes.

Respondida el 11/02/2009 a las 13:20
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more