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

У меня есть приложение splitView, у которого есть rootViewController и DetailsViewController Когда приложение загружает detailsViewController, появляется модальный viewController, который содержит UINavigationBar.

UINavigationBar имеет панель поиска (устанавливается программно). Когда фокус находится на панели поиска, появляется клавиатура.

Однако, в зависимости от ориентации устройства (симулятора), клавиатура всплывает в неправильной ориентации. Клавиатура всегда отображается так, как если бы ipad находился в «нормальном» положении (т. Е. Сбоку от клавиши home)

Я возвращаю ДА во всех методах shouldAutoRotate:

  - (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation;

Чтобы попытаться выяснить, что происходит, я добавил в каждый класс некоторый код отладки, чтобы регистрировать interfaceOrientation каждый раз, когда вызывается событие shouldAutorotate, и в то же время показывает, когда срабатывает модальный метод viewDidLoad. Я сделал тест для каждой ориентации: выходные данные отладки показаны ниже.

Отладка показывает, что независимо от фактической ориентации устройства ориентации интерфейса rootViewController и DetailsViewController всегда являются книжными .

Единственные правильные журналы (где ориентация интерфейса = ориентация устройства) - это первый и последний (третий) раз, когда модальные события shouldAutorotate запускаются в каждом тесте.

Если я поверну iPad после запуска приложения, клавиатура отобразится в правильной ориентации.

Может кто-нибудь пролить свет на то, почему это может происходить и как этого избежать?

[ПОРТРЕТ]

Home Button Положение: внизу
Появляется клавиатура: внизу

DEBUG:

APP DELEGATE - ДОБАВИТЬ SPLITVIEWCONTROLLER
ДЕТАЛИ Интерфейс Портрет
ROOT-интерфейс Портрет
ROOT-интерфейс Портрет
ДЕТАЛИ Интерфейс Портрет
Модальный интерфейс Портрет
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
Модальный интерфейс Портрет

[ЛАНДШАФТ]

Положение домашней кнопки: слева
Появляется клавиатура: слева

DEBUG:

APP DELEGATE - ДОБАВИТЬ SPLITVIEWCONTROLLER
ДЕТАЛИ Интерфейс Портрет
ROOT-интерфейс Портрет
ROOT-интерфейс Портрет
ДЕТАЛИ Интерфейс Портрет
ЛАНДШАФТ МОДАЛЬНОГО ИНТЕРФЕЙСА
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
Модальный интерфейс Портрет
ЛАНДШАФТ МОДАЛЬНОГО ИНТЕРФЕЙСА

[ПОРТРЕТ]

Home Button Положение: верх
Появляется клавиатура: верх

DEBUG:

APP DELEGATE - ДОБАВИТЬ SPLITVIEWCONTROLLER
ДЕТАЛИ Интерфейс Портрет
ROOT-интерфейс Портрет
ROOT-интерфейс Портрет
ДЕТАЛИ Интерфейс Портрет
Модальный интерфейс Портрет
MODAL DID LOAD
МОДАЛЬНО-ВРАЩАЕМЫЙ СТАРТ
MODAL-ROTATE END
Модальный интерфейс Портрет
Модальный интерфейс Портрет

[ЛАНДШАФТ]

Home Button Положение: вправо
Появляется клавиатура: справа

DEBUG:

APP DELEGATE - ДОБАВИТЬ SPLITVIEWCONTROLLER
ДЕТАЛИ Интерфейс Портрет
ROOT-интерфейс Портрет
ROOT-интерфейс Портрет
ДЕТАЛИ Интерфейс Портрет
ЛАНДШАФТ МОДАЛЬНОГО ИНТЕРФЕЙСА
MODAL DID LOAD
MODAL-ROTATE START
MODAL-ROTATE END
Модальный интерфейс Портрет
ЛАНДШАФТ МОДАЛЬНОГО ИНТЕРФЕЙСА

Ответы [ 2 ]

4 голосов
/ 21 сентября 2012

Вам необходимо разрешить iOS обработать событие поворота перед представлением контроллера модального представления.

Вот что происходит:

  1. Приложение запущено.
  2. На основев случае ориентации устройства событие поворота экрана ставится в очередь для существующих контроллеров представления.
  3. До появления поворота экрана создается новый контроллер представления с существующей ориентацией из контроллера представления.
  4. Событие поворота экрана обрабатывается.
  5. Ваш новый контроллер представления оживает с неправильной ориентацией.

Это в основном состояние гонки UIKit.Некоторые из этих деталей являются предположениями, но эффект очевиден.

К счастью, это очень легко исправить.

Вместо того, чтобы создавать новый вид напрямую, запланируйте егообрабатываться в главной очереди.Это будет сделано после отправки текущих событий, включая событие поворота.

Current:

[self presentModalViewController:newViewController animated:YES];

Исправлено:

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentModalViewController:newViewController animated:YES];
});

С этим новым кодомвместо этого вы получаете следующую последовательность:

  1. Приложение запускается.
  2. В зависимости от ориентации устройства событие поворота экрана ставится в очередь для существующих контроллеров представления.
  3. Перед появлением поворота экрана код для создания нового контроллера представления ставится в очередь, но не выполняется.
  4. Событие поворота экрана обрабатывается.
  5. Ваш новый контроллер представления создается с помощью правильная ориентация от контроллера вида.
  6. Ваш новый контроллер вида оживает с правильной ориентацией.
0 голосов
/ 09 июля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...