UIOrientation возвращает 0 или 5 - PullRequest
4 голосов
/ 25 июля 2010

Я запускаю простую функцию, которая вызывается в нескольких областях, чтобы помочь справиться с макетом приложения для iPad во время изменения ориентации.Это выглядит так:

- (void) getWidthAndHeightForOrientation:(UIInterfaceOrientation)orientation {
    NSLog(@"New Orientation: %d",orientation);
end

И я называю это в разных местах, например:

[self getWidthAndHeightForOrientation: [[UIDevice currentDevice] orientation]];

Функция обычно имеет некоторый простой код, который запускается, если ориентация - книжная или альбомная.К сожалению, это не сработало, как ожидалось, когда приложение было запущено в позиции 1. В результате я получаю 0.Позже, если функция вызывается таким же образом, но устройство никогда не поворачивалось, я получаю обратно значение 5. Что это значит?Зачем ему выбрасывать эти значения?

Короче, почему [[UIDevice currentDevice] ориентация] когда-либо выбрасывает 0 или 5 вместо любого значения между 1 и 4?

ОБНОВЛЕНИЕ:

Поскольку я продолжал находить ошибки в своем коде из-за способа обработки ориентации, я написал окончательный пост о том, как обрабатывать ориентации UIDevice или UIInterface: http://www.donttrustthisguy.com/orientating-yourself-in-ios

Ответы [ 3 ]

8 голосов
/ 25 июля 2010

Вы смотрели значения enum для UIInterfaceOrientation?Из документов:

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

Так что это может быть 0-6.

Редактировать: Возможно, вам следует использовать методы на UIViewController (willRotateToInterfaceOrientation:duration: и т. Д.)..) вместо вызова orientation на UIDevice?

3 голосов
/ 16 мая 2012

Я бы порекомендовал использовать UIDeviceOrientationIsValidInterfaceOrientation(orientation)

Он сообщит вам, является ли он действительной ориентацией (допустимо ли это альбомная или книжная ориентация, а не FaceUp / FaceDown / UnKnown)Тогда вы можете рассматривать его как портрет, если он неизвестен.

Вот как я это делаю:

if (UIDeviceOrientationIsValidInterfaceOrientation(interfaceOrientation) && UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
    // handle landscape
} else {
    // handle portrait
}
0 голосов
/ 06 августа 2013

[UIDevice currentDevice].orientation возвращает UIDeviceOrientation:

Значение свойства является константой, которая указывает текущий ориентация устройства. Это значение представляет физическое ориентация устройства и может отличаться от текущей ориентация пользовательского интерфейса вашего приложения.

Ваша функция getWidthAndHeightForOrientation принимает параметр UIInterfaceOrientation:

Ориентация пользовательского интерфейса приложения.

Эти типы, хотя и связаны, не одно и то же. Вы можете получить доступ к текущей ориентации интерфейса из любого контроллера вида, используя self.interfaceOrientation. UIInterfaceOrientation имеет 4 возможных значения, а UIDeviceOrientation имеет 9:

typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
    UIDeviceOrientationUnknown,
    UIDeviceOrientationPortrait,            // Device oriented vertically, home button on the bottom
    UIDeviceOrientationPortraitUpsideDown,  // Device oriented vertically, home button on the top
    UIDeviceOrientationLandscapeLeft,       // Device oriented horizontally, home button on the right
    UIDeviceOrientationLandscapeRight,      // Device oriented horizontally, home button on the left
    UIDeviceOrientationFaceUp,              // Device oriented flat, face up
    UIDeviceOrientationFaceDown             // Device oriented flat, face down
};

// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
    UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
};
...