Como determinar programaticamente a orientação da interface do iPhone?

Os valores possíveis para UIDevice.orientation incluem UIDeviceOrientationFaceUp e UIDeviceOrientationFaceDown . Embora possa ser útil saber que o dispositivo é plano, isso não nos diz se ele é plano exibindo uma interface orientada no modo retrato ou paisagem. Existe uma maneira de encontrar a orientação atual da GUI nos casos em que o dispositivo está retornando informações ambíguas? Suponho que eu poderia rastrear events de mudança de orientação para lembrar a última orientação retrato / paisagem ou verificar a altura e a largura dos limites do UIView principal, mas isso parece meio desajeitado. Existe uma propriedade no dispositivo ou no UIView que estou perdendo?

Em um viewcontroller você pode simplesmente usar o código:

 UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation; 

O UIInterfaceOrientation é um enum:

 typedef enum { UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeRight } UIInterfaceOrientation; 

Você pode obter orientação de 3 maneiras:

  1. UIInterfaceOrientation orientation = self.interfaceOrientation; retorna UIInterfaceOrientation, orientação atual da interface. É uma propriedade no UIViewController, você pode acessá-lo somente nas classs UIViewController .

  2. UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; retorna UIInterfaceOrientation, orientação atual da barra de status do aplicativo. Você pode acessar essa propriedade em qualquer ponto do seu aplicativo . Minha experiência mostra que essa é a maneira mais eficiente de recuperar a orientação real da interface.

  3. UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; retorna UIDeviceOrientation , orientação do dispositivo. Você pode acessar essa propriedade em qualquer ponto do seu aplicativo . Mas observe que UIDeviceOrientation nem sempre é UIInterfaceOrientation. Por exemplo, quando o seu dispositivo está em uma mesa simples, você pode receber um valor inesperado.

Se você apenas se importa que o dispositivo seja paisagem ou retrato, existem alguns methods de conveniência interessantes no viewcontroller:

 UIDeviceOrientationIsLandscape(self.interfaceOrientation) UIDeviceOrientationIsPortrait(self.interfaceOrientation) 

A orientação da barra de status (statusBarOrientation) sempre retorna a orientação da interface, mesmo que a barra de status esteja oculta.

Você pode usar a orientação da barra de status sem um controlador de exibição. Ele fornece a orientação da exibição atual, não a orientação do dispositivo.

 UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 

Eu vi a mesma situação. Especificamente neste stream:

  • O controlador 1 carrega em dizer … Retrato.
  • Empurrar outro controlador para a pilha
  • Enquanto no segundo controlador, gire a orientação do dispositivo para Paisagem.
  • Coloque o dispositivo em uma mesa e, em seguida, retorne ao controlador original.

Neste ponto, todas as verificações de orientação que vi retornam uma orientação inválida de 5, portanto, não é diretamente possível determinar se um layout de paisagem ou retrato deve ser usado. (Eu estou fazendo posicionamento de layout personalizado em uma base por orientação, por isso esta é uma informação significativa)

No meu caso, uma verificação de largura de limite na exibição é usada para determinar o estado real das coisas, mas adoraria saber se outras pessoas abordaram de maneira diferente.

Aqui está um código que você pode achar útil:

 UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation; NSLog( @" ORIENTATION: %@", UIInterfaceOrientationIsLandscape( orientation ) ? @"LANDSCAPE" : @"PORTRAIT");