Строка состояния имеет альбомную ориентацию, но [[UIApplication sharedApplication] statusBarOrientation] возвращает портрет - PullRequest
16 голосов
/ 28 апреля 2011

Эта проблема, кажется, периодически, но я не уверен, почему именно.Когда я запускаю свое приложение на устройстве (iPad), у меня есть некоторый код для загрузки вида прокрутки с некоторыми изображениями в соответствии с текущей ориентацией устройства.Несмотря на то, что перед загрузкой устройство находится в горизонтальном положении, изображения загружаются так, как если бы они были портретными.

Ориентация определяется путем вызова [[UIApplication sharedApplication] statusBarOrientation].

Виды настраиваются для настройки ихположения, когда устройство поворачивается, и, действительно, поворот в книжную ориентацию и затем обратно в альбомную ориентацию возвращает их в правильные альбомные позиции.Это тот случай, когда все приложения запускаются в портретной ориентации и вскоре при необходимости переключаются в альбомную?Я пытаюсь проверить ориентацию слишком рано (во время init первого загружаемого контроллера вида)?

Ответы [ 5 ]

35 голосов
/ 26 января 2013

OK Исправлено.

Использование UINavigationController, когда я popToViewController: animated: из альбомной ориентации в книжную ориентацию, целевое представление отображается правильно, но строка состояния и также UIKeyboard сохраняетконфигурация ландшафта, создающая настоящий беспорядок.

Работа вокруг После тысяч рекомендаций о statusBarOrientation и ссылках прочитайте ... https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

"SetStatusBarOrientation: animated: метод не устарел сразу. Теперь он работает только в том случае, если метод selectedInterfaceOrientations самого верхнего полноэкранного контроллера представления возвращает 0. Это заставляет вызывающего абонента обеспечивать согласованность ориентации строки состояния. "(благодаря Vytis здесь)

statusBarOrientation работает, только если supportInterfaceOrientations возвращает 0, так что ... что дает нам предположение.

Если statusBarOrientation не соответствует ожидаемому, это будет сделано с одним нулевым возвратом (если всегда возвращается 0, представление не будет вращаться, поэтому:

// if deviceOrientation is A (so I expect statusbarOrientation A
// but statusbarOrientation is B
// return 0
// otherwise 
// return user interface orientation for A

- (NSUInteger)supportedInterfaceOrientations {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    UIInterfaceOrientation statusBarOrientation =[UIApplication sharedApplication].statusBarOrientation;
    if(deviceOrientation == UIDeviceOrientationPortrait || deviceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if(statusBarOrientation != UIInterfaceOrientationPortrait ||statusBarOrientation != UIInterfaceOrientationPortraitUpsideDown){
             return 0;
        }
    }
    // otherwise
    return UIInterfaceOrientationMaskPortrait;
}

Теперь, во viewDidAppear (поверьте мне, яиспользуйте этот вызов, даже когда получено уведомление от клавиатуры:

[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;

более 48 часов работы. Надеюсь, это поможет, спасибо всем.

7 голосов
/ 03 мая 2011

Если вы создаете подкласс UIWindow или строку состояния, вы увидите это, потому что это исходная ориентация устройства ipad.Окно UIWindow переводит ориентацию и координаты в то, к чему мы привыкли.После создания AndKeyVisible ориентация вашего устройства и интерфейса в контроллерах представления должна соответствовать ожидаемой.Вы бы случайно не использовали MTStatusBarOverlay?Я прошел через то же самое, и это сводилось к порядку инстатации.

4 голосов
/ 16 августа 2011

На тот случай, если кто-то еще столкнется с этим, я вижу множество приложений, которые имеют похожие проблемы в iOS5, даже на iPhone.

Это может быть ошибка в iOS 5 или просто вмешательство в обычное поведение ...

Я использую пользовательский класс контроллера корневого представления (подкласс UITabBarController, понятия не имею, имеет ли это значение), и в этом классе я переопределил «shouldAutorotateToInterfaceOrientation», чтобы начать вращение только после того, как моя первоначальная настройка экрана будет выполнена (иначе я испортил некоторые вещи) вверх).

Теперь я повторно использую этот класс, чтобы вручную установить statusBarOrientation в портретное положение, прежде чем разрешить вращение, и в любое другое вращающееся положение пользовательского интерфейса.

[[UIApplication sharedApplication] setStatusBarOrientation:toInterfaceOrientation animated:YES];

Полагаю, это тоже может исправить ЭТУ проблему, даже если причина может быть не связана.

1 голос
/ 21 марта 2013

Если у вас возникла эта проблема во время запуска, вам нужно использовать UIDevice, чтобы получить ориентацию устройства, так как statusBarOrientation всегда будет портретным до тех пор, пока приложение не будет выполнено Единственное предостережение заключается в том, что вам нужно включить уведомления об ориентации устройства до или запросить UIDevice для ориентации.

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
0 голосов
/ 03 мая 2011

Вы удостоверились, что у вас есть все это в info.plist?

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
...