UIKeyboardWillShowNotification返回的框架不正确,适用于Swift键盘。

15

我正在使用UIKeyboardWillShowNotificationUIKeyboardWillHideNotification来处理键盘。
这是当键盘显示时调用的函数:

-(void) keyboardWillShow:(NSNotification *)note
{
    CGRect keyboardBounds;
    //[[note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &keyboardBounds];
    NSValue* keyboardFrameBegin = [note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey];
    keyboardBounds = [keyboardFrameBegin CGRectValue];  
}  

我得到了keyboardBounds = (0, 524, 320, 44) 的值,我使用的是5s。不知道为什么origin.y会是524(应该在300左右),高度为44! 我也尝试过注释掉的那行代码。以这两种方式获取键盘边框,结果都是44。这个问题只出现在 swift键盘中。
此问题相同。


看起来像是竞争条件。当使用 UIKeyboardDidShowNotification 时是否出现了相同的问题? - Fabio Poloni
并监听 UIKeyboardDidChangeFrameNotification 并持续保存框架? - Fabio Poloni
@FabioPoloni 我还没有注册UIKeyboardDidChangeFrameNotification。 - Nitish
我仍然认为这是一种竞争条件,因此UIKeyboardDidChangeFrameNotification可能会给您更多的通知,但可能比其他通知更精确。 - Fabio Poloni
这是在设备上还是模拟器上?您是否连接了硬件(可能是蓝牙)键盘到设备上,或者连接到模拟器的硬件键盘?(Hardware > Keyboard > Connect Hardware Keyboard) - rob mayoff
@robmayoff:我正在5c设备上运行。 - Nitish
2个回答

2

问题出在Swift键盘上,方法-(void) keyboardWillShow:(NSNotification *)note被调用了三次,每次返回三个不同的 origin.y 值和高度。第一次它给出的keyboardBounds是(0, 524, 320, 44),第二次它给出的keyboardBounds是(0, 308, 320, 260),最后第三次调用时它返回keyboardBounds为(0, 271, 320, 297)。

由于第三方键盘的大小不固定...其大小会根据视图布局而确定,所以与自动布局情况相似(viewDidLoad、viewWillAppear、viewWillLayout、viewDidLayout和viewDidAppear),可以在viewDidAppear或viewDidLayout中获取确切的框架信息,在这里,当视图完全布局完成后就能得到确切的框架信息。


UIKeyboard没有开放的布局事件。 - ShahiM
1
Swift键盘是自定义键盘,它具有事件,请在发表评论之前仔细阅读问题。 - Mehul Thakkar
如果您在iOS 11中遇到了不正确的高度问题,请参考https://dev59.com/8KTja4cB1Zd3GeqPF7OP#46273070。 - ViruMax

0

也许你可以尝试其他通知,例如:UIKeyboardDidShowNotificationUIKeyboardDidChangeFrameNotificationUIKeyboardWillShowNotification

只是告诉你键盘将要显示,无法准确告诉你键盘的显示框架。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接