У меня есть контроллер представления, прослушивающий как UIKeyboardWillShowNotification, так и UIKeyboardWillHideNotification. Обработчики этих уведомлений настраивают различные части представления, что является стандартной процедурой.
Следующий код используется для преобразования прямоугольника клавиатуры из экранных координат:
CGRect keyboardBounds = [self.view convertRect:[keyboardBoundsValue CGRectValue] fromView:nil];
Опять же, стандартная процедура. К сожалению, существует критическая ситуация, когда это преобразование не удается.Посмотрите, что происходит, когда iPhone поворачивается из книжной в альбомную при развернутой клавиатуре:
1) iOS автоматически запускает UIKeyboardWillHideNotification; self.interfaceOrientation сообщается как портрет; keyboardBounds.height равен 216.0. Это имеет смысл. Почему? Потому что обработчику уведомлений предоставляется возможность «очистить» перед тем, как представление переключится в ландшафтный режим.
2) iOS автоматически запускает UIKeyboardWillShowNotification; self.interfaceOrientation сообщается как портрет; keyboardBounds.height равен 480.0. Это НЕ имеет смысла. Почему нет? Потому что обработчик уведомлений будет делать свою работу, думая, что высота клавиатуры равна 480.0!
Apple ошиблась в этом вопросе или я что-то не так делаю?
Обратите внимание, что прослушивание вместо UIKeyboard DidShowNotification не является допустимым решением, поскольку оно значительно ухудшает работу пользователя. Почему? Потому что анимация моих изменений в представлении после анимации развертывания клавиатуры выглядит... ну, довольно ужасно.
Кому-нибудь удалось добиться идеальной работы автоповорота при развернутой клавиатуре? Это похоже на взрыв хаоса, который Apple полностью упустила из виду. >:|