Как проверить, в каком положении (пейзаж или портрет) сейчас находится iPhone? - PullRequest
34 голосов
/ 25 марта 2010

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

Если я напишу просто

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)
   if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
   //Code
   }
   else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight||interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
   //Code
   }
}

Вид просто сходит с ума, если пользователь повернул устройство перед встряхиванием.

Есть ли способ получить текущую ориентацию айфонов?

Ответы [ 13 ]

49 голосов
/ 08 октября 2011

Вот макросы UIDeviceOrientationIsLandscape и UIDeviceOrientationIsPortrait

так что, проверяя отдельно, вы можете сделать это так ...

if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    // code for landscape orientation      
}

OR

 if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
 {
     // code for Portrait orientation       
 }
33 голосов
/ 25 марта 2010

Используйте метод [[UIDevice currentDevice] orientation], как указано здесь .

17 голосов
/ 15 июля 2012

Как сказал Бено, это кажется лучшим ответом, если вы обнаруживаете ориентацию на ранней стадии просмотра. Я не смог получить одобренный ответ, чтобы вернуть результат на ранней стадии установки, но это прекрасно работает.

if (UIDeviceOrientationIsPortrait(self.interfaceOrientation)){
//DO Portrait
}else{
//DO Landscape
}
11 голосов
/ 25 марта 2010

Для добавления к уже отвеченному вопросу:

Вы используете [[UIDevice currentDevice] orientation], что даст одно из следующих значений:

typedef enum {
   UIDeviceOrientationUnknown,
   UIDeviceOrientationPortrait,
   UIDeviceOrientationPortraitUpsideDown,
   UIDeviceOrientationLandscapeLeft,
   UIDeviceOrientationLandscapeRight,
   UIDeviceOrientationFaceUp,
   UIDeviceOrientationFaceDown
} UIDeviceOrientation;

Документацию можно найти здесь - (ориентация) и здесь - (UIDeviceOrientation) .

(Я не хочу требовать от бывшего ответчика, но эта информация была слишком большой для комментария.)

6 голосов
/ 20 октября 2016

Попробуйте это:

[[UIApplication sharedApplication] statusBarOrientation]

Или в Swift 3:

UIApplication.shared.statusBarOrientation

Чтобы специально проверить конкретную ориентацию, вы также можете попробовать свойство isLandscape или isPortrait, например:

UIApplication.shared.statusBarOrientation.isLandscape

Проблема с [[UIDevice currentDevice] orientation] заключается в том, что он также вернет UIInterfaceOrientationUnknown, а statusBarOrientation - нет.

Существует также свойство UIViewController interfaceOrientation, но оно устарело в iOS 8, поэтому не рекомендуется.

Вы проверяете документацию для statusBarOrientation здесь

6 голосов
/ 17 января 2015

Это поможет вам ...

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation ]== UIDeviceOrientationLandscapeRight)
 {
   NSLog(@"Lanscapse");
 }
if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown )
 {
   NSLog(@"UIDeviceOrientationPortrait");
 }
}
6 голосов
/ 10 ноября 2010

Вы также можете использовать свойство interfaceOrientation класса UIViewController, если вы застряли и постоянно получаете UIDeviceOrientationUnknown от UIDevice.

Существует хорошее резюме того, почему [[UIDevice currentdevice] ориентация] иногда может не срабатывать здесь: http://bynomial.com/blog/?p=25, особенно, если вы хотите быстро определить ориентацию (например, если вы хотите проверить прямо при выходе приложения вне фона).

3 голосов
/ 20 августа 2018

  • Как простое решение Swift 4.2

    override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
            switch UIDevice.current.orientation{
            case .portrait:
                print("Portrait")
            case .portraitUpsideDown:
                print("PortraitUpsideDown")
            case .landscapeLeft:
                print("LandscapeLeft")
            case .landscapeRight:
                print("LandscapeRight")
            default:
                print("Another")
            }
        }
    
3 голосов
/ 20 августа 2014

Вы также можете определить константы, чтобы заработать время:

#define LANDSCAPE UIInterfaceOrientationIsLandscape(self.interfaceOrientation)
#define LANDSCAPE_RIGHT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft
#define LANDSCAPE_LEFT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight
#define PORTRAIT UIInterfaceOrientationIsPortrait(self.interfaceOrientation)
#define PORTRAIT_REVERSE [UIDevice currentDevice].orientation == UIDeviceOrientationPortraitUpsideDown
1 голос
/ 09 мая 2018

Обновление до iOS 8+, где UIViewController.interfaceOrienation устарел, вы должны использовать traitCollections. Так, например, чтобы проверить ландшафт на iPhone, вы должны использовать:

if self.traitCollection.verticalSizeClass == .compact
{
  your code
}

Обратите внимание, что на iPad это не так, потому что на iPad в альбомной ориентации класс размера не равен compact. Apple Doc Link

Sizes from Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...