¿Existe alguna forma documentada de configurar la orientación del iPhone?

Resuelto Dave Verwer asked hace 15 años • 17 respuestas

Tengo una aplicación en la que me gustaría admitir la rotación del dispositivo en ciertas vistas, pero otras no tienen mucho sentido en el modo horizontal, por lo que al cambiar las vistas me gustaría forzar que la rotación se establezca en vertical.

Hay un configurador de propiedades no documentado en UIDevice que funciona, pero obviamente genera una advertencia del compilador y podría desaparecer con una revisión futura del SDK.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

¿Existen formas documentadas de forzar la orientación?

Actualización: pensé en proporcionar un ejemplo, ya que no estoy buscando shouldAutorotateToInterfaceOrientation porque ya lo he implementado.

Quiero que mi aplicación admita paisaje y retrato en la Vista 1, pero solo retrato en la Vista 2. Ya implementé debería AutorotateToInterfaceOrientation para todas las vistas, pero si el usuario está en modo horizontal en la Vista 1 y luego cambia a la Vista 2, quiero forzar la teléfono para volver a rotar a vertical.

Dave Verwer avatar Oct 08 '08 15:10 Dave Verwer
Aceptado

Esto es mucho después del hecho, pero en caso de que aparezca alguien que no esté usando un controlador de navegación y/o no desee usar métodos no documentados:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

Es suficiente presentar y descartar un controlador de vista básico.

Obviamente, aún necesitarás confirmar o negar la orientación en tu anulación de shouldAutorotateToInterfaceOrientation. Pero esto hará que el sistema vuelva a llamar a shouldAutorotate....

Josh avatar Feb 06 '2011 18:02 Josh

Estaba teniendo un problema donde tenía una UIViewControllerpantalla en la pantalla, UINavigationControlleren orientación horizontal. Sin embargo, cuando se introduce el siguiente controlador de vista en el flujo, necesitaba que el dispositivo volviera a la orientación vertical.

Lo que noté fue que el shouldAutorotateToInterfaceOrientation:método no se llama cuando se inserta un nuevo controlador de vista en la pila, sino que se llama cuando se extrae un controlador de vista de la pila .

Aprovechando esto, estoy usando este fragmento de código en una de mis aplicaciones:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

Básicamente, al crear un controlador de vista vacío, empujarlo hacia la pila y sacarlo inmediatamente, es posible hacer que la interfaz vuelva a la posición vertical. Una vez que se ha activado el controlador, simplemente presiono el controlador que pretendía presionar en primer lugar. Visualmente, se ve genial: el usuario nunca ve el controlador de vista arbitrario y vacío.

Andrew Vilcsak avatar Aug 19 '2010 21:08 Andrew Vilcsak

Hay una forma sencilla de forzar mediante programación el iPhone a la orientación necesaria, utilizando dos de las respuestas ya proporcionadas por kdbdallas , Josh :

//will rotate status bar
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];


//will re-rotate view according to statusbar
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

Funciona de maravilla :)

EDITAR:

para iOS 6 necesito agregar esta función: (funciona en el controlador de vista modal)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}
Guntis Treulands avatar May 09 '2012 12:05 Guntis Treulands