Проверьте наличие разделенной клавиатуры

Как многие из вас знают, iOS 5 представила гладкую разделенную клавиатуру для ввода большого пальца. К сожалению, у меня есть некоторый пользовательский интерфейс, который зависит от обычной полноэкранной раскладки клавиатуры. Один из моих контроллеров отображает пользователя с листом ввода текста, и если они нажмут на textField, который будет закрыт клавиатурой, он сместится вместе с клавиатурой. Это действие не требуется с помощью разделенной клавиатуры.

Есть ли способ проверить, какая раскладка клавиатуры используется до того, как она появится?

Спасибо!

Ответы

Ответ 1

Когда клавиатура состыкована, UIKeyboardWillShowNotification будет поднят. Если клавиатура разделена или отстыкована, уведомления о клавиатуре не поднимаются.

Если клавиатура состыкована, UIKeyboardWillShowNotification будет поднята, и будет выполнено следующее:

[[[notification userInfo] valueForKey:@"UIKeyboardFrameChangedByUserInteraction"] intValue] == 1

Если клавиатура отстыкована, будет добавлен UIKeyboardWillHideNotification, и приведенный выше оператор также будет правдой.

Использование этой информации было для меня достаточным для кодирования моего пользовательского интерфейса.

Примечание. Это может быть нарушение правил Apple, я не уверен.

Ответ 2

Это решение, которое работает с iPad-клавиатурами (первоначально из блога, связанного с комментарием Zeeshan)

[[NSNotificationCenter defaultCenter] 
  addObserverForName:UIKeyboardDidChangeFrameNotification
  object:nil
  queue:[NSOperationQueue mainQueue]
  usingBlock:^(NSNotification * notification)
 {
     CGRect keyboardEndFrame =
     [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

     CGRect screenRect = [[UIScreen mainScreen] bounds];

     if (CGRectIntersectsRect(keyboardEndFrame, screenRect))
     {
         // Keyboard is visible
     }
     else
     {
         // Keyboard is hidden
     }
}];

Ответ 3

Клавиша

UIKeyboardFrameChangedByUserInteraction не возвращает 1 все время, когда расщепляется клавиатура.

Ниже приведены значения ключевых слов словаря пользовательской информации на UIKeyboardDidShowNotification/UIKeyboardDidHideNotification.

2012-07-11 11:52:44.701 Project[3856:707] keyboardDidShow: {
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 352}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 944}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 592}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{-352, 0}, {352, 1024}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 0}, {352, 1024}}";
}

2012-07-11 11:52:45.675 Project[3856:707] keyboardDidHide: {
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 352}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 592}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 944}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {352, 1024}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{-352, 0}, {352, 1024}}";
}

Вместо этого вы можете использовать клавиши UIKeyboardCenterBeginUserInfoKey или UIKeyboardCenterEndUserInfoKey, чтобы получать уведомления, когда расщепление клавиатуры.

Надеюсь, это поможет!

Ответ 4

Уведомления, которые публикуются, когда клавиатура появляется или меняет свое положение (UIKeyboardWillShowNotification, UIKeyboardWillChangeFrameNotification), содержат словарь userInfo с фреймом клавиатуры (UIKeyboardFrameEndUserInfoKey), который позволяет вам позиционировать элементы интерфейса правильно, в зависимости от фактического размера и расположения клавиатуры.