2012-06-11 2 views
4

Мне нужно изменить фоновое изображение изображения в зависимости от ориентации. Для этого я использую statusBarOrientation подход в viewWillAppear:Неверное значение для статусаBarOrientation on viewWillAppear

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    if (UIInterfaceOrientationIsPortrait(currentOrientation)) { 
     NSLog(@"PORTRAIT"); 
    } else if (UIInterfaceOrientationIsLandscape(currentOrientation)) { 
     NSLog(@"LANDSCAPE"); 
    } 
} 

Проблема заключается в том, что консоль всегда показывает ПОРТРЕТ, даже когда IPad проводится в ландшафтном режиме. Тот же код в viewDidAppear работает правильно, но есть слишком поздно, и пользователь может видеть смену изображений. Это заставляет меня думать, что правильное состояние statusBarOrientation по-прежнему недоступно в viewWillAppear, но я прочитал в некоторых других вопросах, что этот код должен работать там.

+0

Что еще более странно в том, что в viewWillTransitionToSize: вы можете запросить ориентацию, и если вы дважды повернете телефон (вернитесь в его позицию viewDidLoad), statusBarOrientation вернет вам правильный ответ. Хотя он дал другой ответ в viewDidLoad, и теперь устройство находится в той же ориентации, что и тогда! –

ответ

12

Попробуйте

int type = [[UIDevice currentDevice] orientation]; 
    if (type == 1) { 
     NSLog(@"portrait default"); 
    }else if(type ==2){ 
     NSLog(@"portrait upside"); 
    }else if(type ==3){ 
     NSLog(@"Landscape right"); 
    }else if(type ==4){ 
     NSLog(@"Landscape left"); 
    } 
+1

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

+0

Добро пожаловать –

+1

Я искал всюду ... interfaceOrientation, statusBar все возвращали неверную ориентацию, Затем это решение работало +1 .. – iMeMyself

3

Вы не должны использовать statusBarOrientation для определения текущей ориентации приложения. Согласно документу Apple: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html

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

Попробуйте использовать interfaceOrientation свойство UIViewController, чтобы получить ориентацию текущего приложения.

+1

Я использовал этот подход, потому что в нескольких ответах здесь в Stackoverflow рекомендуется получить ориентацию. С ориентацией [[UIDevice currentDevice]] он работал. Чтение интерфейса свойствOrientation также работало. –

+0

Ссылка на документацию Apple не означает, что вы не должны использовать ее для определения текущей ориентации. Можете ли вы дать нам ссылку на источник, который говорит, почему вы не должны? Фактически, пример кода Apple использует его: https://developer.apple.com/library/content/samplecode/AVCam/Listings/Swift_AVCam_CameraViewController_swift.html#//apple_ref/doc/uid/DTS40010112-Swift_AVCam_CameraViewController_swift-DontLinkElementID_15 Cmd-F для statusbarOrientation. На самом деле ориентация UIDevice предупреждает, что она может отличаться от ориентации вашего пользовательского интерфейса, поэтому, судя по документам, ее следует избегать. –

+0

Это дает проблемы с некоторыми устройствами. Спасибо, яблоко. – Warpzit

0

Вот полезный фрагмент кода для входа interfaceOrientation устройства:

NSArray* orientations = @[ @"nothing", @"UIInterfaceOrientationPortrait", @"UIInterfaceOrientationPortraitUpsideDown", @"UIInterfaceOrientationLandscapeLeft", @"UIInterfaceOrientationLandscapeRight”]; 
NSLog(@"Current orientation := %@", orientations[self.interfaceOrientation]); 

Надеюсь, что это помогает кто-то из!

Смежные вопросы