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。