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];
Удачи:)