TextField не плавно поднимается с помощью клавиатуры, как в Whatsapp и Hangouts

Я пытаюсь имитировать UITextField-ключение клавиатуры в приложении WhatsApp. Как большинство из вас знает, есть фиксированная UITextField в нижней части экрана и клавиатура появляется, когда вы нажимаете UITextField, Пока идет клавиатура, UITextField придерживайтесь клавиатуры, и они скользят очень плавно.

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

Что я уже пробовал:

  • Слушал уведомления клавиатуры. Я использовал оба setFrame: а также setContentOffset:animated: метод в анимационном блоке. Не работает так хорошо, как ожидалось. UIViewAnimationCurve значение, которое имеет анимация клавиатуры, равно 7, я не смог найти, что это значит UIViewAnimationCurve имеет только 4 целочисленных типа enum. Я думаю, что анимация кривой клавиатуры не предоставляется разработчикам, я надеюсь, что я не прав.

  • Использование пользовательского inputAccessoryView с более низким значением z-index. У меня было два точных UIViewsодно фиксируется внизу, а другое - на заказ inputAccessoryView который собирался спрятаться под фиксированным, поскольку он имеет более низкий zPosition значение. Поэтому пользователь не собирался видеть inputAccessoryView приближался из-за пределов экрана, но клавиатура фиксировала изображение. Но опять бесполезно. изменения zPosition значение ничего не меняет.

Наконец, я подумал, что Whatsapp может использовать не системную клавиатуру, а пользовательскую. Но если это так, то это очень плохой выбор дизайна, поэтому этот вариант исключен.

Кто-нибудь имеет представление о том, как Whatsapp (или Hangouts) реализовал это?

2 ответа

Решение

Самый простой способ сделать это оказался правильным.

Я должен был слушать keyboardWillShow/keyboardWillHide уведомления и animateWithDuration: как они срабатывают. Пункт, который я пропустил, был UIViewAnimationCurve в UIViewAnimationOptionCurve сдвигом (<<16).

NSDictionary *notification = [aNotification userInfo];
UIViewAnimationOptions curveValue = [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue] << 16;
...
[UIView animateWithDuration:{animation duration}
                      delay:0
                    options:curveValue
                 animations:^{
                     //animation code
                 }
                 completion:nil];

Значение '7' не является степенью 2, поэтому это не конкретное значение анимации, скорее это может быть сумма (или побитовая или) нескольких значений анимации. Решение (работает для меня):

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:[info[UIKeyboardAnimationDurationUserInfoKey] floatValue]];
[UIView setAnimationCurve:[userInfo[UIKeyboardAnimationCurveUserInfoKey] intValue]];
// set view frame here
[UIView commitAnimations];

Удачи:)

Другие вопросы по тегам