Строка состояния - Пейзаж, но [[UIApplication sharedApplication] statusBarOrientation] возвращает портрет

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

Ориентацию можно найти, вызвав [[UIApplication sharedApplication] statusBarOrientation].

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

Ответ 1

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

Ответ 2

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

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

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

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

statusBarOrientation работает только в том случае, если поддерживаетсяInterfaceOrientations возвращает 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 трудовых часов в этом. Надеюсь, это поможет, спасибо всем.

Ответ 3

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

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

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

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

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

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

Ответ 4

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

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

Ответ 5

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

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