iPad: обнаружение внешней клавиатуры - PullRequest
7 голосов
/ 16 февраля 2011

Мое приложение использует UIAccessoryView для обеспечения дополнительных функциональных возможностей клавиатуры (например, вкладок вперед / назад и клавиш со стрелками) для виртуальной клавиатуры, но это вызывает срабатывание UIKeyboardDidShowNotification даже при наличии физической клавиатуры (аксессуар появляется на нижняя часть экрана).

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

Я пытался изучить клавишу UIKeyboardFrameEndUserInfoKey, но она возвращает реальный размер для виртуальной клавиатуры, несмотря на то, что ничего не отображается.

Есть ли способ обнаружить наличие физической клавиатуры, чтобы предотвратить это нежелательное поведение?


Хм, сюжет утолщается.

Я попытался отключить вспомогательное устройство ввода, вернув nil из свойства inputAccessoryView объекта Responder, который запускает клавиатуру. Это подавляет UIKeyboardWillShowNotification и UIKeyboardDidShowNotification, когда присутствует физическая клавиатура, но сохраняет эти уведомления, когда такой клавиатуры нет. Пока все хорошо.

Затем я попытался повторно включить inputAccessoryView только после получения UIKeyboardWillShowNotification. Он срабатывает только тогда, когда требуется виртуальная клавиатура, поэтому он должен позволить мне вновь представить вспомогательный вид в этих обстоятельствах. Или так я думал.

К сожалению, похоже, что ОС не проверяет inputAccessoryView после UIKeyboardWillShowNotification, поэтому она не отображает вспомогательный вид, когда это необходимо: o (

Это оставляет мне два варианта:

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

Не лучший выбор, поэтому я по-прежнему заинтересован, чтобы кто-нибудь еще решил эту проблему!

Ответы [ 2 ]

8 голосов
/ 29 марта 2011

(Этот ответ был предложен Шоном Хибером на форумах Apple)

Когда вы получаете UIKeyboardDidShowNotification, вместо того чтобы использовать кадр, заданный UIKeyboardFrameEndUserInfoKey, просто проверьте, где находится вспомогательное представление вида, и используйте его вместо этого. Все, что я делаю, это проверяю, что представляет собой рамка вспомогательного вида, и преобразую его в координатное пространство моего собственного вида. Тогда я могу легко использовать этот кадр, чтобы решить, что делать.

Примечание. Когда экранная клавиатура отображается / скрывается с помощью кнопки извлечения клавиатуры Bluetooth, кажется, что UIKit снова отправляет UIKeyboardDidShowNotification, но не UIKeyboardWillHideNotification. Это также является противоречивым несоответствием, но вышеуказанный обходной путь все еще действителен, так как система изменит кадр inputAccessoryView, когда он перемещается на экранной клавиатуре, так что вы все равно можете настроить все соответствующим образом.

2 голосов
/ 29 марта 2015

Если вы осмотрите кадр в UIKeyboardFrameEndUserInfoKey, вы обнаружите, что он смещен на высоту клавиатуры, когда подключена внешняя клавиатура (в основном это " появляется ", но никогда не появляется вышев нижней части экрана), чтобы вы могли преобразовать его в локальное координатное пространство и пересечь его с границами вашего вида, чтобы найти видимую высоту клавиатуры.

- (void)keyboardWillShow:(NSNotification *)notification {

    UIView *view = [self view];
    CGRect bounds = [view bounds];
    CGRect keyboardFrame = [[notification userInfo][UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect convertedKeyboardFrame = [view convertRect:keyboardFrame fromView:nil];
    CGRect intersection = CGRectIntersection(convertedKeyboardFrame, bounds);

    // intersection.size.height == 0 with external keyboards
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...