Как программно определить ориентацию интерфейса iPhone? - PullRequest
52 голосов
/ 11 марта 2009

Возможные значения для UIDevice.orientation включают UIDeviceOrientationFaceUp и UIDeviceOrientationFaceDown. Хотя может быть полезно знать, что устройство плоское, оно не говорит нам, является ли оно плоским, отображая интерфейс, ориентированный в портретном или ландшафтном режиме. Есть ли способ найти текущую ориентацию GUI в случаях, когда устройство возвращает неоднозначную информацию? Полагаю, я мог бы отслеживать события изменения ориентации, чтобы запомнить последнюю портретную / альбомную ориентацию или проверить высоту и ширину границ основного UIView, но это кажется грязным. Есть ли на устройстве или в UIView свойство, которое мне не хватает?

Ответы [ 6 ]

95 голосов
/ 09 октября 2010

Ориентацию можно получить тремя способами:

  1. UIInterfaceOrientation orientation = self.interfaceOrientation; возвращает UIInterfaceOrientation, текущую ориентацию интерфейс. Это свойство в UIViewController, вы можете получить доступ к этот только в классах UIViewController .

  2. UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; возвращает UIInterfaceOrientation, текущую ориентацию строка состояния приложения. Вы можете получить доступ к этому свойству в любой пункт вашей заявки . Мой опыт показывает, что это самый эффективный способ для получения реальной ориентации интерфейса.

  3. UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; возвращает UIDeviceOrientation , ориентация устройства. Вы можете получить доступ к этому свойству в любой точке вашего применение . Но обратите внимание, что UIDeviceOrientation не всегда UIInterfaceOrientation. Например, когда ваше устройство находится на равнине В таблице вы можете получить неожиданное значение.

92 голосов
/ 11 марта 2009

В viewcontroller вы можете просто использовать код:

UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation;

UIInterfaceOrientation является перечислением:

typedef enum {
  UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
  UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
  UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeLeft,
  UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeRight
} UIInterfaceOrientation;
14 голосов
/ 23 апреля 2012

Если вы просто хотите, чтобы устройство работало в горизонтальной или вертикальной ориентации, на контроллере представления есть несколько удобных методов:

UIDeviceOrientationIsLandscape(self.interfaceOrientation)
UIDeviceOrientationIsPortrait(self.interfaceOrientation)
11 голосов
/ 27 октября 2011

Ориентация строки состояния (statusBarOrientation) всегда возвращает ориентацию интерфейса , даже если строка состояния скрыта.

Вы можете использовать ориентацию строки состояния без контроллера вида. Это дает вам текущую ориентацию вида, а не ориентацию устройства.

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
5 голосов
/ 11 марта 2009

Я видел ту же ситуацию. Конкретно в этом потоке:

  • Контроллер 1 загружается в скажем .. Портрет.
  • Вставьте еще один контроллер в стек
  • Находясь во втором контроллере, поверните устройство в ориентацию на альбомную.
  • Положите устройство на стол, а затем вернитесь к исходному контроллеру.

На этом этапе любые проверки ориентации, которые я видел, возвращают неверную ориентацию 5, поэтому невозможно напрямую определить, следует ли использовать альбомную или портретную компоновку. (Я делаю настраиваемое расположение макетов для каждой ориентации, так что это важная информация)

В моем случае проверка ширины границ в представлении используется для определения истинного положения вещей, но я бы хотел знать, обращались ли другие по-другому.

1 голос
/ 23 мая 2013

Вот пример кода, который вам может пригодиться:

UIInterfaceOrientation  orientation = [UIDevice currentDevice].orientation;
NSLog( @" ORIENTATION: %@", UIInterfaceOrientationIsLandscape( orientation ) ? @"LANDSCAPE" : @"PORTRAIT");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...