UIOrientation возвращает 0 или 5

Я запускаю простую функцию, которая вызывается в нескольких областях, чтобы помочь справиться с макетом приложения для 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 ответа

Решение

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

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

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

if (UIDeviceOrientationIsValidInterfaceOrientation(interfaceOrientation) && UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
    // handle landscape
} else {
    // handle portrait
}

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

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

Так что это может быть что угодно от 0 до 6.

Изменить: Может быть, вы должны использовать методы на вашем UIViewController (willRotateToInterfaceOrientation:duration:и т. д.) вместо звонка orientation на UIDevice?

[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
};
Другие вопросы по тегам