UitabBarController com ViewControllers utilizando diferentes orientações?
Pergunta
Eu posso ver que isso é algo que tem incomodado muitas pessoas:/
Eu tenho um UITABBARController que possui 4 ViewControllers, todos do tipo UinavigationController. Um dos NavigationControllers recebe um ViewController empurrado para a pilha, este ViewController deve ser apresentado no modo/orientação da paisagem.
O ViewController é um gráfico, é o lugar absolutamente único no aplicativo em que a paisagem faz sentido. (Eu escondo o Uitabbar quando isso é apresentado para não levar o usuário a acreditar que isso funcionará em todos os lugares)
Para fazer com que um UitabBarController responda corretamente às mudanças na orientação, todos os seus ViewControllers precisam retornar o mesmo valor do método delegado:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Portanto, para acomodar esse comportamento, implementei esse método em todos os viewcontrollers pertencentes ao UitabBarController:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL canRotate = [defaults boolForKey:@"can_rotate"];
return canRotate;
}
O "truque" é agora que, quando meu viewcontroller pode ser empurrado, eu faço isso:
- (void) viewWillAppear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"can_rotate"];
[defaults synchronize];
}
E quando é estourado, eu faço isso:
- (void) viewWillDisappear:(BOOL)animated {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:NO forKey:@"can_rotate"];
[defaults synchronize];
}
Isso funciona muito bem. Quando o ViewController está na pilha, eu posso girar o dispositivo e a exibição segue.
O problema é, no entanto, que, se o usuário tocar o botão "traseiro" no NavigationBar enquanto estiver no modo paisagem, colocando assim o ViewController para o ViewController anterior, este "antigo" ViewController também está no modo de paisagem. Para piorar as coisas, porque eu defino o bool para não, esse viewcontroller "antigo" não pode girar de volta quando oriento o dispositivo para o modo retrato.
Existe uma maneira de atualizar tudo para que nenhum dos meus outros viewcontrollers esteja no modo de paisagem quando eu colocar o modo ViewController de Modo de paisagem de bancada?
Estou um pouco preocupado que, se isso pudesse ser feito da paisagem ao retrato, também deve ser possível de retrato à paisagem, tornando meu "hack" desnecessário ... mas se não puder, voltarei à estaca:/
Espero estar perto e que alguém possa me ajudar a chegar lá, obrigado :)
Solução
Eu acho que posso simplificar a coisa toda ....
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}
-(void) ViewDidAppear: (bool) animado {[UIView BEGNIMAÇÕES:@"View Flip" Contexto: 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] .statusBarorietation = uiInterfaceRientationlandsCoperright;
[UIView commitAnimations];
[super viewDidAppear:animated];
}
Nada gira automaticamente, mas você gira manualmente a visão que deseja mover. Se você não precisar de suporte ao teclado na visualização, não precisa alterar a base de status.
Se você nem sempre deseja que essa visualização gire, então você tem um problema um pouco mais difícil - convém verificar os valores do acelerômetro para descobrir qual é o caminho do telefone (ou pode ser possível implicar de que maneira o telefone foi girado Por chamadas para o devedor de intensidade, basta ligar para o código de transformação como e quando precisar.