Ориентация устройства iPad всегда неправильная, когда она плоская

Я знаю, что эта тема привлекает много внимания здесь, в SO, но ни одно из «решений» не работает для меня. Вот ситуация:

  1. iPad ровно лежит на моем столе (ориентация устройства лицевой стороной вверх), главный экран отлично читается, но кнопка «Домой» находится сверху. Таким образом, это эффективно показывает ориентацию интерфейса "Книжная вверх ногами".

  2. я запускаю свое приложение

  3. Приложение вызывает beginGeneratingDeviceOrientationNotifications, чтобы убедиться, что акселерометр работает, и приходят уведомления об ориентации.

  4. При запуске мое приложение запрашивает как «ориентацию интерфейса», так и «ориентацию устройства». Результаты:

     STARTUP ORIENTATION:
         INTERFACE ORIENTATION: UIInterfaceOrientationPortrait
         DEVICE ORIENTATION: UIDeviceOrientationFaceUp
    

    В документах Apple говорится, что каждое приложение (интерфейс?) запускается в портретной ориентации, так что это может иметь смысл. Ориентация устройства также правильная, потому что это действительно лицо вверх.

  5. Сразу после запуска приходит первое уведомление об ориентации:

    NOTIFICATION 1: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationPortrait
    

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

  6. Как отмечают многие, следует еще одно (только одно, а не два) уведомление об ориентации:

    NOTIFICATION 2: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationFaceUp
    

    По-прежнему книжная (а не перевернутая) для интерфейса и обратно лицевой стороной вверх для устройства (что правильно).

Мое приложение настраивается правильно и отображается вверх ногами, что совершенно неправильно.

Что я могу сделать, чтобы узнать последнюю известную ориентацию, которая отображается на главном экране и в другом пользовательском интерфейсе на iPad?

Это приложение OpenGL только с окном и представлением. Я уже добавил в смесь UIViewController, чтобы увидеть, дает ли это более точную информацию, но это то же самое и неправильно. Я знаю, что я не единственный разработчик, который борется с этим, потому что многие приложения, которые у меня есть на моем iPad, тоже делают это неправильно, вам нужно наклонить устройство, чтобы они правильно сориентировались. Но некоторые приложения делают все правильно, в чем секрет?


person zmippie    schedule 08.06.2011    source источник
comment
Я ничего не знаю о разработке iPad, но как физически определить ориентацию, когда устройство плоское?   -  person Oliver Charlesworth    schedule 09.06.2011
comment
Оли, что мне нужно, чего я не совсем ясно объяснил, так это то, что такое последняя известная ориентация, та, которая отображается в пользовательском интерфейсе iPad. Я добавлю это.   -  person zmippie    schedule 09.06.2011
comment
Вы уверены, что код, отображающий ориентацию, правильный? Если устройство плоское, оно должно сохранять ту же ориентацию (если ваше приложение не поддерживает ее).   -  person ughoavgfhw    schedule 09.06.2011
comment
Пользователи iPad ожидают, что приложение для iPad будет правильно открываться в любой ориентации, в которой они держат устройство. Нужно ли вам вести запись кеша ориентации, чтобы вы могли сравнить его, когда сообщаются лица вверх/вниз?   -  person Luke    schedule 09.06.2011
comment
@ughoavgfhw: такое поведение задокументировано многими (но не Apple). События последовательной (пере)ориентации описаны здесь: blogs.remobjects. com/blogs/mh/2010/06/29/p1685 as: По сути, устройство делает вид, что пользователь действительно быстро встряхнул его обратно в вертикальное положение и снова опустил.   -  person zmippie    schedule 09.06.2011
comment
@Krypton: эта проблема затрагивает мое приложение только тогда, когда оно только запускается, поэтому нет возможности вести запись, просто недостаточно данных для записи.   -  person zmippie    schedule 09.06.2011


Ответы (1)


Хорошо, мне не приятно признать, что я упустил важную часть лабиринта, а именно ориентацию устройства/интерфейса iOS: свойство UISupportedInterfaceOrientations в файле Info.plist вашего приложения.

Я прочитал об этом и (ошибочно) предположил, что при указании поддерживаемых ориентаций поведение не изменится. Но, как оказалось, это не просто фильтр уведомлений об ориентации (это не так, вы по-прежнему получаете уведомления для неподдерживаемых ориентаций), а тип/порядок уведомлений различается в зависимости от того, как устройство ориентировано.

В моем случае меня не интересовали ориентации «лицом вверх» и «лицом вниз», поэтому я просто их проигнорировал. Это не хорошая идея. Если вы явно укажете поддерживаемые ориентации:

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

... тогда вы все равно увидите поведение, которое я описал в комментариях выше:

«По сути, устройство притворяется, что пользователь действительно быстро встряхнул его, вернув его в вертикальное положение, и снова опустил».

... но первая переданная ориентация не всегда книжная, а правильная ориентация.

Итак, в сценарии, который я описываю в своем вопросе, ориентация устройства будет следующей:

AT STARTUP: UIDeviceOrientationFaceUp
NOTIFICATION 1: UIDeviceOrientationPortraitUpsideDown <-- CORRECT!
NOTIFICATION 2: UIDeviceOrientationFaceUp <-- CORRECT, BUT IGNORE

Я бы не хотел заходить так далеко и называть это ошибкой со стороны Apple, но мне непонятно, почему переданная ориентация в NOTIFICATION 1 всегда книжная, когда вы не указываете UISupportedInterfaceOrientations.

Обратите внимание, что это относится только к iPad. Пользовательский интерфейс главного экрана на iPod Touch и iPhone всегда отображается в книжной ориентации, поэтому легче понять, какая ориентация была при запуске (как вы уже догадались: портретная)...

person zmippie    schedule 10.06.2011