Возможные значения для UIDevice.orientation включают UIDeviceOrientationFaceUp и UIDeviceOrientationFaceDown. Хотя может быть полезно знать, что устройство плоское, это не говорит нам, будет ли он плоским отображать интерфейс, ориентированный в портретном или альбомном режиме. Есть ли способ найти текущую ориентацию графического интерфейса в тех случаях, когда устройство возвращает неоднозначную информацию? Я предполагаю, что я мог отслеживать события изменения ориентации, чтобы запомнить последнюю портретную/альбомную ориентацию или проверить основные границы UIView и ширину, но это кажется kludgey. Есть ли свойство на устройстве или UIView, которое мне не хватает?
Как программно определить ориентацию интерфейса iPhone?
Ответ 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");
