Как программно определить ориентацию интерфейса 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");