Как программно определить ориентацию интерфейса iPhone?

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

Ответ 1

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

UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation;

UIInterfaceOrientation - это перечисление:

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

Ответ 5

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

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

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

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

Ответ 6

Здесь вы можете найти полезный код:

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