ориентация устройства iPad всегда неправильная, когда он плоский - PullRequest
8 голосов
/ 09 июня 2011

Я знаю, что эта тема привлекает большое внимание здесь, в 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, тоже делают это неправильно, вам нужно наклонить устройство, чтобы они правильно сориентировались.Но некоторые приложения do , кажется, понимают это правильно, в чем секрет?

1 Ответ

4 голосов
/ 10 июня 2011

Ладно, я не рад признать, что я сделал пропустил важную часть лабиринта - ориентацию устройства / интерфейса 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 всегда в портретной ориентации, поэтому легче узнать, какая была эта ориентация при запуске (вы уже догадались: портрет ) ...

...