Как вручную повернуть клавиатуру (с анимацией)? - PullRequest
4 голосов
/ 22 июня 2011

У меня есть контроллер, который управляет UITextView. Обычно в приложении, которое поддерживает несколько ориентаций интерфейса, я просто переопределяю -shouldAutorotateToInterfaceOrientation:, устанавливаю соответствующие маски с автоматическим изменением размера и продолжаю свой веселый путь. Продолжая свой веселый путь, если бы я должен был начать редактирование этого UITextField, скажем, в портретном режиме, а затем повернуть устройство в альбомную ориентацию, клавиатура будет прекрасно анимироваться в ландшафтном режиме вместе с остальным видом. Это то, что я хочу.

Теперь, в этом конкретном приложении, у меня есть корневое представление, которое должно * когда-либо находиться в портретном режиме. Это предварительный просмотр камеры. У меня также есть оверлейный вид для обзора камеры, который я хотел бы иметь для поддержки всех ориентаций интерфейса. Вот где находится UITextView.

Таким образом, из-за корневого просмотра с фиксированной ориентацией я не могу использовать встроенный поворот: я должен сделать это вручную. Это не проблема, я могу зарегистрироваться на UIDeviceOrientationDidChangeNotification и вручную анимировать соответствующий поворот и настройку кадра для наложения.

Этого достаточно, чтобы правильно расположить вид, но клавиатура будет отображаться только в портретной ориентации. Опять же, я могу исправить это с помощью -setStatusBarOrientation: UIApplication каждый раз, когда я получаю уведомление о том, что устройство повернуто.

Но здесь возникает проблема. Я надеюсь, что комбинация:

  • Регистрация уведомлений о ротации
  • Ручной поворот вида
  • Установка ориентации строки состояния (с анимацией)

будет достаточно, чтобы точно повторить поведение автоматического поворота. Но это не оправдывает себя одним важным способом: если бы клавиатуру нужно было показать в одной ориентации, а затем повернуть в другую, клавиатура вызывающе осталась бы в исходном положении, как если бы никогда не вызывали -setStatusBarOrientation:. Насколько я знаю, единственное, что влияет на представление клавиатуры, - это ориентация строки состояния приложения, и для ее настройки есть только один способ. Так мне не повезло? Неужели невозможно заставить клавиатуру вращаться с видом вручную, как это происходит с автоповоротом?

Добавление
В попытке избежать покрытия старой земли, я попробовал следующие решения хаки:

  • При изменении ориентации подать в отставку и немедленно стать первым респондентом снова. Это заставляет клавиатуру двигаться в правильной ориентации, но это происходит без анимации, а иногда и приводит к очень плохим вещам, таким как показ клавиатуры с альбомной ориентацией в портретной и наоборот.
  • При изменении ориентации просто подать в отставку первого респондента. Это также имеет странное поведение - мгновенно перемещать (но не изменять размеры) клавиатуру в новую ориентацию, а затем отклонять ее с помощью анимации. Это очень уродливо и неприятно.

Ответы [ 2 ]

1 голос
/ 22 июня 2011

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

Вместо этого рассмотрите возможность поддержки поворота путем «встречного поворота» вида предварительного просмотра камеры вместо принудительного перевода ВК в портретный режим.Если это выглядит немного странно, вы можете сделать «мерзкую хакерскую» версию: добавьте вид предварительного просмотра камеры как подпредставление окна, под видом вашего VC, и дайте виду вашего VC прозрачный фон.

0 голосов
/ 14 января 2013

Может быть, поздно на вечеринку.Я наткнулся на ту же проблему.Попытка исправить это в iOS 6.

Очевидно, что Apple пока что не распознала эту проблему, иначе они бы уже исправили ее: метод -setStatusBarOrientation: включает другие элементы интерфейса, кроме только статусабар, или есть альтернативные методы для установки ориентации клавиатуры и других элементов.Жаль, что они не

Отключение ориентационного вращения, когда клавиатура поднята, для меня не является решением, но я нашел другое простое решение hack:

  • return NO в -(BOOL)shouldAutorotate
  • return UIInterfaceOrientationMaskAll в -(NSUInteger)supportedInterfaceOrientations
  • прослушивание уведомлений о повороте устройства

Затем при получении такого уведомления:

  • скрыть строку состояния
  • когда клавиатура поднята, убрать клавиатуру ([myTextField resignFirstResponder])
  • выполнить анимацию вращения вручную
  • установить ориентациюстрока состояния ([sharedApplication setStatusBarOrientation:newOrientation animated:NO])
  • показать строку состояния
  • , если клавиатура была видна раньше, представить ее снова ([myTextField becomeFirstResponder])

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

Кстати, я также нашел эту интересную статью Кори Флойда: http://coreyfloyd.tumblr.com/post/8212203583/2-ways-to-rotate Хотя его второй метод: обман UIKit, только вызвал больше путаницы ся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...