iOS: altera a orientação da interface quando o controlador de visualização pop

9

Todos os controladores de visualização do meu aplicativo estão funcionando apenas na orientação retrato, exceto um que pode ser orientado por retrato ou paisagem.

Eu tenho um cenário de uso como o seguinte:

  1. Eu envio o controlador que funciona em ambas as orientações para o UITabBarController
  2. Orientação de alteração do usuário de portait para paisagem
  3. Usuário pressione "botão voltar"

Após essas ações, o aplicativo permanece na orientação paisagem e não o altera automaticamente para retrato.

Eu controlo a orientação do controlador de exibição usando supportedInterfaceOrientations (eu uso o iOS 6.0). O que eu faço de errado? Como posso obter o comportamento correto quando o aplicativo altera automaticamente a orientação para permitido quando o usuário pressiona o botão Voltar? Obrigado pela resposta!

    
por Daniil Popov 28.12.2012 в 14:46
fonte

4 respostas

2

No iOS 6 (e possivelmente anterior), se um controlador de exibição estiver fora da tela quando o dispositivo girar, ele não receberá nenhuma notificação. Também não é enviado willAnimateRotationToInterfaceOrientation:duration: quando se torna o controlador de vista superior.

Você precisa acompanhar a orientação atual do controlador de visualização e verificar a orientação do dispositivo em viewWillAppear: . Se forem diferentes, você pode usar willAnimateRotationToInterfaceOrientation:duration: para configurá-lo corretamente.

Como isso é algo que você provavelmente fará muito, talvez queira criar uma superclasse genérica da qual seus controladores de visualização herdam.

Uma solução típica é:

@implementation MyHandlesOffscreenRotationController
{
    BOOL   isShowingPortrait;
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    isShowingPortrait = UIInterfaceOrientationIsPortrait(
                        [[UIApplication sharedApplication] statusBarOrientation]);
}


- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

        BOOL currIsPortrait = UIInterfaceOrientationIsPortrait(
                              [[UIApplication sharedApplication] statusBarOrientation]);

    if ((isShowingPortrait && !currIsPortrait) ||
        (!isShowingPortrait && currIsPortrait)) {
        [self willAnimateRotationToInterfaceOrientation:
                [[UIApplication sharedApplication] statusBarOrientation]
                                              duration:0.0f];
    }
}

@end
    
por Maurice Sharp 05.04.2013 / 05:04
fonte
2

iOS 9 e acima

Na hora do pop, basta escrever o código abaixo no seu método viewWillAppear .

[[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationPortrait]forKey:@"orientation"];

Com isso, sua visualização aparecerá no modo retrato.

    
por Mohit Kumar 31.07.2017 / 14:51
fonte
1

Apenas substitua -(BOOL)shouldAutoRotate and - (NSUInteger)supportedInterfaceOrientations dentro de uma categoria UINavigationController , então o ViewController irá forçar a rotação para sua orientação suportada após pop de outro ViewController.

@implementation UINavigationController (Rotate)

- (BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

@end
    
por Story 26.06.2015 / 11:32
fonte
0

P.L. tem uma boa solução neste tópico: Apresentar e descartar instantaneamente um controlador de exibição modal vazio que permite apenas o retrato | paisagem

Como alterar a orientação do dispositivo programaticamente no iOS 6

    
por Nico 06.03.2014 / 03:10
fonte