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
};