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 :)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top