Подтвердить что ты не робот

Определите UIInterfaceOrientation на iPad

Мне не нужно указывать ориентацию в этом случае, мне просто нужно ее обнаружить, но у меня проблемы. У меня есть условный код, который должен работать только в портрете, и если устройство в ландшафте, мне нужно сделать что-то еще. Поскольку deviceOrientation не обязательно совпадает с интерфейсом, я не могу найти способ проверить портретный режим.

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

-(void)viewDidLoad {
    [super viewDidLoad];
    //currentOrientation is declared as UIInterfaceOrientation currentOrientation
    currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation);  // == NULL
}

Мне нужно определить значение interfaceOrientation и программы условно. Спасибо за вашу помощь!

4b9b3361

Ответ 1

Знаете ли вы о свойстве interfaceOrientation класса UIViewController?

- (void) viewDidLoad {
    [super viewDidLoad];
    BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
    // now do whatever you need
}

Или вы после [[UIDevice currentDevice] orientation]?

Ответ 2

В частности, при запуске я нашел, что для пользовательского интерфейса всегда будет точная точность, независимо от того, что UIDevice говорит о ориентации.

[UIApplication sharedApplication].statusBarOrientation

Ответ 3

self.interfaceOrientation ненадежна в определенных ситуациях. Например, повторная компоновка вкладок в приложении табуляции возвращает неверное значение.

Однако [UIApplication sharedApplication].statusBarOrientation всегда надежный. Ты спас меня много времени. Спасибо.

Ответ 4

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if ((orientation == UIInterfaceOrientationLandscapeLeft)
||  (orientation == UIInterfaceOrientationLandscapeRight) )
{
    //Landscape
}
else
{
    //Portrait
}

Ответ 5

Я знаю, что это очень старый пост. Как бы то ни было, я хотел бы добавить пункт, чтобы сказать, что лучше лучше проверить ориентацию строки состояния. Когда вы звоните self.interfaceorientation, он вызывает shouldRotateToOrientation каждый раз. Если вы написали какой-то код в этом методе, он будет выполнен. Поэтому будьте осторожны!

Ответ 6

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 

    if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
        if(debug){
            NSLog(@"Nothing to change because it is gone to Flat");
        }
        return;
    }
    if(deviceOrientation !=statusBarOrientation){
        if(debug){
            NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation  );
        }
    }

Ты не поверишь мне, пока не увидишь на консоли второй выход! Некоторые ситуации - и они существуют! - отображается последний контент NSLog!

Чем вам придется обходиться, так как у iOS нет ошибок, удачи всем!

А, что... модератор форума, возможно, удалит этот пост, потому что это не значит быть и отвечать по его мнению!

Я надеюсь, что это поможет кому-то однажды, это происходит и на iphone... (там у меня есть)

Ответ 7

Немного смешайте:

BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;

(edit) Очевидно, что предыдущие ответы - правильный способ сделать это, и это решение потерпит неудачу в ситуации, когда контроллеры представлений не являются полноэкранными.

Ответ 8

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
   if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
        some instructions;
   } else { 
        some instructions;
   }
}

Это фрагмент из одной из моих программ. Конечно, вы можете использовать оператор if в своем уведомлении ViewDidLoad.

Ответ 9

Как и в iOS8, API устарели или возвращают бесполезные результаты, такие как .FaceUp .FaceDown

Это связано с тем, что Apple не хочет, чтобы вы обновляли свой пользовательский интерфейс с помощью ориентации, но, используя классы, ограничения и пропорции размера (используя n% от супервизора).

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

Ответ 10

Я уже проголосовал за ответ @slycrel, но я хотел бы потратить время, чтобы написать это, и указать некоторые вещи, которые, кажется, потеряны в этом старом вопросе и множество других вопросов по этому вопросу.

Верно, что Apple действительно не хочет, чтобы мы обновили большую часть нашего пользовательского интерфейса на основе изменений ориентации, но это все еще вполне возможно, а иногда и необходимо в каждом конкретном случае, и так будет, пока Apple не улучшит свои новые (ish) API (например, viewWillTransitionToFrame: будет более полезным, чем viewWillTransitionToSize:. Просто скажите)

Почему я голосовал за ответ @slycrel, связан с тем, что вам нужно иметь в виду как логическое различие между UIDeviceOrientation и UIInterfaceOrientation.

Строка состояния - это то, что обозначает известное в настоящее время приложение UIInterfaceOrientation. Все эти вещи о FaceUp, FaceDown относятся только к ориентации устройства, а не к вашим приложениям. Приложение не поддерживает ориентацию устройства в любом случае. Действительно, UIDeviceOrientation можно полностью игнорировать, если все, что вам нужно сделать, это убедиться, что вы правильно настроили и анимируете вещи в своем интерфейсе, что составляет 99% случаев использования приложений для разработчиков приложений. В настоящее время это достигается с помощью строки состояния UIInterfaceOrientation из ответа @slycrel:

[UIApplication sharedApplication].statusBarOrientation

Следует отметить, что версия этого свойства readwrite устарела, версия readonly не существует.

Возьмите этот пример:

  • У меня есть приложение, которое поддерживает ВСЕ ориентации интерфейсов и контроллер корневого представления, который также поддерживает их.
  • Теперь я представляю UIViewController, который приведет к тому, что ориентация в строке состояния станет ландшафтной.
  • Какая ландшафтная ориентация (слева или справа), на которую она идет, основана на том, что возвращается preferredInterfaceOrientationForPresentation для этого контроллера представления, какова текущая ориентация устройства и какие ориентации интерфейса поддерживается контроллером представления (см. следующую точку).
  • Строка состояния перейдет в альбомную, независимо от ориентации текущего устройства, поскольку этот контроллер просмотра поддерживает только пейзаж, основанный на том, что возвращается supportedInterfaceOrientations. Допустим, что мы поддерживаем оба пейзажа влево и вправо с помощью UIInterfaceOrientationMaskLandscape.
  • Я также хочу условно анимировать этот контроллер представления в положение с преобразованием вращения. Это будет необходимо только при переходе от портрета или портрета вверх дном, к пейзажному левому или ландшафтному праву. В противном случае это будет более простая анимация презентации без вращения.
  • Затем, после некоторого времени и использования устройства, я отклоняю этот контроллер представления.
  • Теперь я хочу условно анимировать этот контроллер представления с экрана с другим преобразованием вращения. Это будет необходимо только при переходе с пейзажа влево или вправо, на портрет или портрет вверх ногами. В противном случае это будет более простая анимация увольнения без вращения.
  • В этот момент ориентация строки состояния станет тем, что решает система, подходит для комбинации предпочтительной ориентации интерфейса контроллера корневого представления и поддерживаемых ориентаций интерфейса, а также тока устройства UIDeviceOrientation.
  • Поскольку контроллер просмотра мы будем поддерживать ВСЕ ориентации интерфейса, если ваша ориентация устройства - FaceUp или FaceDown, , вы не можете надежно угадать следующий UIInterfaceOrientation на основе UIDeviceOrientation, и вы не должны в любом случае.
  • Итак... Ориентация строки состояния на спасение!

Предыдущий пример возможен, поскольку ориентация строки состояния не обновляется, когда начнется переход контроллера представления (система запрашивает делегат перехода для аниматора и т.д.). Затем он обновляется, когда начинается переход анимации (например, к моменту времени animationTransition:). Таким образом, вы должны иметь хорошее сравнение, просто используя начальное и текущее значения строки состояния UIInterfaceOrientation.

Даже без использования переходов контроллера просмотра все равно будет безопасно обновлять представления в зависимости от ориентации строки состояния.

Имейте в виду, если вы вручную обновляете строку состояния, и если вы не используете "Просмотр состояния панели управления на основе контроллера" в вашем Info.plist, тогда ваша прикладная логика должна быть когда строка состояния будет и изменит ориентацию. Вероятно, вы будете искать пару имен NSNotification для этих случаев:

  • UIApplicationWillChangeStatusBarOrientationNotification
  • UIApplicationDidChangeStatusBarOrientationNotification

Кроме этих методов UIApplicationDelegate:

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window

И это другое полезное свойство UIApplication:

@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;