У меня есть контроллер, который управляет UITextView. Обычно в приложении, которое поддерживает несколько ориентаций интерфейса, я просто переопределяю -shouldAutorotateToInterfaceOrientation:
, устанавливаю соответствующие маски с автоматическим изменением размера и продолжаю свой веселый путь. Продолжая свой веселый путь, если бы я должен был начать редактирование этого UITextField, скажем, в портретном режиме, а затем повернуть устройство в альбомную ориентацию, клавиатура будет прекрасно анимироваться в ландшафтном режиме вместе с остальным видом. Это то, что я хочу.
Теперь, в этом конкретном приложении, у меня есть корневое представление, которое должно * когда-либо находиться в портретном режиме. Это предварительный просмотр камеры. У меня также есть оверлейный вид для обзора камеры, который я хотел бы иметь для поддержки всех ориентаций интерфейса. Вот где находится UITextView.
Таким образом, из-за корневого просмотра с фиксированной ориентацией я не могу использовать встроенный поворот: я должен сделать это вручную. Это не проблема, я могу зарегистрироваться на UIDeviceOrientationDidChangeNotification
и вручную анимировать соответствующий поворот и настройку кадра для наложения.
Этого достаточно, чтобы правильно расположить вид, но клавиатура будет отображаться только в портретной ориентации. Опять же, я могу исправить это с помощью -setStatusBarOrientation:
UIApplication каждый раз, когда я получаю уведомление о том, что устройство повернуто.
Но здесь возникает проблема. Я надеюсь, что комбинация:
- Регистрация уведомлений о ротации
- Ручной поворот вида
- Установка ориентации строки состояния (с анимацией)
будет достаточно, чтобы точно повторить поведение автоматического поворота. Но это не оправдывает себя одним важным способом: если бы клавиатуру нужно было показать в одной ориентации, а затем повернуть в другую, клавиатура вызывающе осталась бы в исходном положении, как если бы никогда не вызывали -setStatusBarOrientation:
. Насколько я знаю, единственное, что влияет на представление клавиатуры, - это ориентация строки состояния приложения, и для ее настройки есть только один способ. Так мне не повезло? Неужели невозможно заставить клавиатуру вращаться с видом вручную, как это происходит с автоповоротом?
Добавление
В попытке избежать покрытия старой земли, я попробовал следующие решения хаки:
- При изменении ориентации подать в отставку и немедленно стать первым респондентом снова. Это заставляет клавиатуру двигаться в правильной ориентации, но это происходит без анимации, а иногда и приводит к очень плохим вещам, таким как показ клавиатуры с альбомной ориентацией в портретной и наоборот.
- При изменении ориентации просто подать в отставку первого респондента. Это также имеет странное поведение - мгновенно перемещать (но не изменять размеры) клавиатуру в новую ориентацию, а затем отклонять ее с помощью анимации. Это очень уродливо и неприятно.