TextField不会被键盘平滑推送,例如Whatsapp和Hangouts

时间:2014-04-30 09:02:53

标签: ios uiscrollview uitextfield iphone-softkeyboard

我正在尝试模仿Whatsapp应用中的UITextField - 键盘关系。 正如大多数人所知,屏幕底部有一个固定的UITextField,点击UITextField时会出现键盘。当键盘出现时,UITextField会粘在键盘上,并且它们可以非常顺畅地滑动。

阅读Apple的文档页面,这些页面是关于在键盘下移动视图的几次。

到目前为止我尝试过的内容:

  • 收听键盘通知。我在动画块中使用了setFrame:setContentOffset:animated:方法。没有像预期的那样好。键盘动画的UIViewAnimationCurve值为7,我找不到它的含义,因为UIViewAnimationCurve只有4个整数枚举类型。我认为键盘动画的动画曲线没有提供给开发人员,我希望我错了。

  • 使用z-index值较低的自定义inputAccessoryView 。我有两个确切的UIViews,一个固定在底部,另一个是自定义inputAccessoryView,它将隐藏在固定的一个之下,因为它的zPosition值较低。因此,用户不会看到inputAccessoryView从屏幕外部出现,但固定视图被键盘推高了。但是没有用了。更改zPosition值不会改变任何内容。

最后,我认为Whatsapp可能没有使用系统键盘而是自定义键盘。但如果是这种情况,那么这是一个非常糟糕的设计选择,以便消除选项。

任何人都知道Whatsapp(或环聊)是如何实现的?

2 个答案:

答案 0 :(得分:2)

最直接的做法是证明这是正确的方法。

我应该在触发时听取keyboardWillShow / keyboardWillHide次通知和animateWithDuration:通知。我错过的一点是通过转移(<< 16)将UIViewAnimationCurve投射到UIViewAnimationOptionCurve

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

答案 1 :(得分:1)

值'7'不是2的幂,因此它不是特定的动画值,而是可能是多个动画值的总和(或按位或)。 解决方案(为我工作)是:

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