TextField 没有被键盘顺利推上,就像在 Whatsapp 和环聊中一样

Posted

技术标签:

【中文标题】TextField 没有被键盘顺利推上,就像在 Whatsapp 和环聊中一样【英文标题】:TextField is not pushed up smoothly by keyboard, like in Whatsapp and Hangouts 【发布时间】:2014-04-30 09:02:52 【问题描述】:

我正在尝试模仿 Whatsapp 应用中的 UITextField-keyboard 关系。 众所周知,屏幕底部有一个固定的UITextField,当您点击UITextField 时,键盘会出现。当键盘出现时,UITextField 粘在键盘上,它们一起滑动非常顺畅。

阅读 Apple 的文档页面,其中有关在键盘下多次移动视图。

到目前为止我所尝试的:

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

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

最后,我认为 Whatsapp 可能没有使用系统键盘,而是使用自定义键盘。但如果是这样的话,这是一个非常非常糟糕的设计选择,因此该选项被消除了。

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

【问题讨论】:

【参考方案1】:

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

我应该在keyboardWillShow/keyboardWillHide 通知和animateWithDuration: 被触发时听取它们。我错过的一点是通过移位(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];

【讨论】:

【参考方案2】:

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

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

祝你好运:)

【讨论】:

以上是关于TextField 没有被键盘顺利推上,就像在 Whatsapp 和环聊中一样的主要内容,如果未能解决你的问题,请参考以下文章

如何发现 TextField 编辑被取消/键盘折叠/焦点丢失

swift 点击Textfield 后自动上移,避免键盘被遮住

我如何在SWIFTUI中把textField作为firstResponder,就像Swift一样:textField.becomesFirstResponder。

Flutter TextField在键盘上溢出底部

Flutter TextField被键盘隐藏,尝试了很多解决方案但不起作用

隐藏在键盘后面的文本字段