ios8调用 - (void) onKeyboardShow:(NSNotification *)通知两次
Posted
技术标签:
【中文标题】ios8调用 - (void) onKeyboardShow:(NSNotification *)通知两次【英文标题】:ios8 calls - (void) onKeyboardShow:(NSNotification *)notification two times 【发布时间】:2014-09-12 17:22:36 【问题描述】:我们有一个带有 UITextField 和 UITextView 的屏幕。
当我点击其中任何一个方法时:
- (void) onKeyboardShow:(NSNotification *)notification
被调用。
UITextField 有 .autocorrectionType = UITextAutocorrectionTypeNo;而 UITextView 的 autocrrectionType 为 yes。
我在 onKeyboardShow 上有以下代码:
CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
我遇到了两个问题:
-
即使键盘已经在屏幕上并且您从一个字段点击到另一个字段,也会调用该方法。这在 ios7 中没有发生。
两个调用中的高度相同,不考虑一个与另一个中的建议栏。
对于 UITextView,高度是:253,对于 UITextField 是 216。但是如果用户首先点击文本字段,他会得到 216,然后当再次点击 UITextView 时,大小是 216。如果以不同的顺序完成,我会得到 253两者兼得。
有人有同样的经历吗?这是预期的吗?我是否必须检查哪个字段是触发 onKeyboardShow 的字段,以便使我的 UI 适应一个高度和另一个高度并硬编码建议栏的高度?我可以从 NSNotification 中获取建议栏的高度吗?
感谢您的帮助
【问题讨论】:
我也经历过同样的事情。我认为这可能是因为在 iOS8 中,键盘具有动态高度。 (自定义键盘可以有自定义高度!)此外,每个文本字段可能需要不同类型的键盘 - 电子邮件、数字键盘等。我认为回调发生在文本字段更改时,以便提供最新的键盘信息。 数字 1。如果 textfield 和 textview 都将自动更正设置为 NO,则 onKeyboardShow 仅发生一次。 2号。我没有找到获取此信息的方法。我猜它可能是一个 UIKeyboardAdtionalFrameHeight (?) 你的第一点真的很有趣!听起来像是 QuickType 顶部的额外栏。您还可以查看UIKeyboardDidChangeFrameNotification
。至于您的一个问题,我认为键盘的高度确实包括建议栏。所以它只是一个数字。
【参考方案1】:
部分回答。
-
我尝试复制您的第一个问题并且可以。通知被调用的原因是当你有一个启用自动更正的键盘时,它有一个顶部的建议栏。当您在文本字段之间切换时,它必须使顶栏进出动画。通知将提供最新的键盘框架。
如果文本字段为自动更正,则会弹出这个小虫子。如果自动更正关闭,则弹出(超出框架)。
-
您不必弄清楚当前选择了哪个字段来正确处理键盘。即使是确切的高度也不重要。 (您不应该对键盘高度进行硬编码。)
我看到您使用的是 UIKeyboardFrameBeginUserInfoKey。 我建议使用 UIKeyboardFrameEndUserInfoKey。
这对我有用:
- (void)keyboardShown:(NSNotification *)note
CGRect keyboardRect = [[[note userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
self.customConstraint.constant = -keyboardRect.size.height - 20;
注意:约束只是将我的自定义视图固定在底部。因此,当键盘显示时,它只是将约束抵消了适当的量。 不是最好的解决方案。我不知道为什么我必须有 -20 才能让它工作,但我会继续挖掘。
【讨论】:
以上是关于ios8调用 - (void) onKeyboardShow:(NSNotification *)通知两次的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8 自定义标签 LayoutSubviews 方法永远不会被调用?
UITextView setText 不应该在 ios8 中跳到顶部
UISplitViewController 的详细视图仅在 iOS8 上采用全屏
iOS 9(Swift 2.0):无法使用类型为“(NSURL,(_,_,_)throws-> Void)”的参数列表调用“dataTaskwithURL”