сплит-клавиатура для iPad

Я создаю приложение, похожее на приложение iMessage для iPad, которое отправляет сообщения. Таким образом, есть вид ввода, закрепленный в нижней части вида сообщения, и вид вспомогательного ввода при отображении клавиатуры. Кроме того, размер сообщения должен быть соответствующим образом изменен, когда клавиатура отображается, когда она установлена или отсоединена.

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

Во-первых, есть 3 способа отсоединения клавиатуры от пользователя:

Нажмите и удерживайте нижнюю правую клавишу, затем сдвиньте вверх Нажмите и удерживайте нижнюю правую клавишу, когда появится всплывающее меню, выберите «открепить» Нажмите и удерживайте нижнюю правую клавишу, когда появится всплывающее меню, выберите «разделить»

Для случая № 1 данные уведомления от UIKeyboardWillChangeFrameNotification согласованы. Вот данные:

userInfo = {
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}";
}

Для случаев № 2 и № 3 данные противоречивы, вот что я получаю:

userInfo = {
    UIKeyboardAnimationCurveUserInfoKey = 0;
    UIKeyboardAnimationDurationUserInfoKey = "0.25";
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {768, 304}}";
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {384, 872}";
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {384, 1136}";
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}";
    UIKeyboardFrameChangedByUserInteraction = 0;
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, -264}, {768, 304}}";
}

Странно, что когда я слушаю UIKeyboardDidChangeFrameNotification в случае № 2 или № 3, данные поступают, как и ожидалось:

userInfo = {
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}";
}

Почему данные уведомления отличаются? Кто-нибудь нашел четкий способ обнаружения событий с разделенной клавиатурой?

Ответы на вопрос(2)

я решил эту проблему в следующих шагах:

Получить текущую ориентацию. Если ориентация - Пейзаж, тогда я получаюрос of UIKeyboardFrameEndUserInfoKey. должно равняться 216. Это означает, что клавиатура находится в режиме Split, иначе нет; Если ориентация - Портрет, тогда я получаюрос of UIKeyboardFrameEndUserInfoKey. должно равняться 216. Это означает, что клавиатура находится в режиме Split, иначе нет;

Я обновляю свойgist например. С помощью метода convertRect.

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

NSArray *classPath = @[
  @"KeyboardAutomatic",
  @"KeyboardImpl",
  @"KeyboardLayoutStar",
  @"KBKeyplaneView",
  @"KBSplitImageView"
];
UIView *splitView = textField.inputAccessoryView.superview;
for (NSString *className in classPath) {
  for (UIView *subview in splitView.subviews) {
    if ([NSStringFromClass([subview class]) rangeOfString:className].location != NSNotFound) {
      splitView = subview;
      break;
    }
  }
}
BOOL isSplit = [splitView.subviews count] > 1;

Очевидно, что для того, чтобы это работало, вам нужен UITextField / UITextView с ненулевымinputAccessoryView (вы можете просто использовать пустое представление для этого).

Заметка ПоведениеtextField.inputAccessoryView.superview довольно привередлив, и обычно зависит от того, была ли клавиатура отображена один раз перед вызовомsuperview. Также, чтобы пройти процесс отправки в App Store, я удалил префикс «UI» из имен частных классов. Это не гарантия, что Apple не пометит ваше приложение, но этот подход успешно использовался ранее.

Я тестировал его только на iOS7, но если он не работает на других версиях iOS, можно использовать аналогичные подходы.

ВАШ ОТВЕТ НА ВОПРОС