Pregunta

Me puede ver que esto es algo que ha venido preocupando a mucha gente: /

Tengo un UITabBarController que tiene 4 viewControllers, todo tipo UINavigationController. Uno de los navigationControllers consigue un viewController inserta en su pila, esta viewController deben presentarse en el modo horizontal / orientación.

El viewController es un gráfico, es el absolutamente único lugar de la aplicación donde el paisaje tiene sentido. (Me escondo la UITabBar cuando este se presenta al no conducir al usuario a creer que esto funcionará en todas partes)

Para hacer un responden UITabBarController correctamente a los cambios en la orientación de todas sus viewControllers deben devolver el mismo valor a partir del método delegado:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Así que para dar cabida a este comportamiento he implementado este método en todos los viewControllers pertenecientes a la UITabBarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

El "truco" es ahora que cuando mi poder-ser-paisaje viewController es empujado hago esto:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

y cuando se hace estallar, hago esto:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

Esto funciona muy bien. Cuando el viewController está en la pila I puede girar el dispositivo y la vista sigue.

El problema es, sin embargo, que si el usuario pulsa el botón "atrás" en la navigationbar mientras que en el modo horizontal, apareciendo así la viewController a la viewController anterior, este "viejo" viewController es, por supuesto, también en el modo horizontal. Para empeorar las cosas, porque me puse la BOOL en NO, este "viejo" viewController puede volver no gira cuando orientar el dispositivo en el modo de retrato.

¿Hay una manera de actualizar todo para que ninguno de mis otros viewControllers estará en modo horizontal cuando me pop el modo viewController puede-ser-en-el paisaje?

Estoy un poco preocupado de que si esto se podría hacer de horizontal a vertical sino que también debe ser posible de vertical a horizontal, con lo que mi "Hack" innecesaria .. pero si no puede, entonces estoy de vuelta a un cuadrado : /

Hope estoy cerca y que alguien podría ayudarme a conseguir allí, gracias:)

¿Fue útil?

Solución

creo que puedo simplificar todo lo ....

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

Nada gira de automóviles, pero a continuación, girar manualmente la vista que desea mover. Si usted no necesita soporte de teclado en la vista que no es necesario cambiar el statusBarOrientation.

Si no siempre se desea que la vista girada entonces usted tiene un problema un poco más difícil - es posible que desee comprobar los valores del acelerómetro para averiguar qué camino alrededor del teléfono está (o podría ser posible dar a entender de qué manera el teléfono ha sido convertido por las llamadas a shouldAutotateToInterfaceOrientation y luego simplemente llamar al código transformar como y cuando lo necesite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top