2014-04-30 6 views
1

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

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

То, что я пытался до сих пор:

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

  • Использование пользовательского вводаAccessoryView с более низким значением индекса z. У меня было два точных 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]; 
+0

вы сделали мой день приятель !!! – thndrkiss

1

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

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

Удачи :)