iOS 11 - 键盘高度在键盘通知中返回0

时间:2017-08-15 08:59:52

标签: ios objective-c nsnotificationcenter

我一直在使用键盘通知,没有任何问题,并获得精确的键盘高度。

- (void)keyboardDidShow:(NSNotification *) notification{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    NSLog(@"%f",keyboardSize.height);}

但是在iOS 11中,调用通知时键盘的大小为0。

此方案中出现的问题是什么?我正在使用xcode 9 Beta 5

7 个答案:

答案 0 :(得分:177)

使用此:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

对于Swift,您可以使用:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

答案 1 :(得分:98)

替换UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

以下内容来自Apple Docs。

  

UIKeyboardFrameBeginUserInfoKey- NSValue对象的键   包含标识键盘起始帧的CGRect   在屏幕坐标中。

     

UIKeyboardFrameEndUserInfoKey - NSValue对象的键   包含一个CGRect,用于标识键盘的结束帧   屏幕坐标。

答案 2 :(得分:7)

试试这个:

UIKeyboardFrameBeginUserInfoKey替换为UIKeyboardFrameEndUserInfoKey

答案 3 :(得分:5)

我使用Xcode Version 9.0(9A235)时遇到了类似的问题;虽然我使用的是Swift。在我的keyboardWillShow方法中,我写了以下内容:

RLANG

奇怪的是,第一次调用keyboardWillShow时,heightValue为216.0,但在后续调用中它变为0!也许这是一个Xcode错误。

我用UIKeyboardFrameEndUserInfoKey替换了UIKeyboardFrameBeginUserInfoKey,它为我解决了这个问题。

答案 4 :(得分:2)

此问题发生在iOS 11上。

  

替换

     

“UIKeyboardFrameBeginUserInfoKey”with“UIKeyboardFrameEndUserInfoKey”

     

如下所示将解决问题

Objective-C代码:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Swift 2.3:

let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size

斯威夫特3:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

答案 5 :(得分:1)

您的方法尝试在显示帧高度之前获取它的高度,这就是为什么它应该为0的原因,我不确定为什么第一次尝试时它不是这样!这是一个如何在Swift 4.2中正确获取键盘高度的示例:

func keyboardWillShow(notification: Notification) {

    guard let userInfo = notification.userInfo else { return }

    guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }

    keyboardFrame = view.convert(keyboardFrame, from: nil)

    let keyboardHeight = keyboardFrame.height
}

这将正确提供键盘框架属性,之前出现键盘。

答案 6 :(得分:1)

使用以下代码计算键盘高度。对于同时使用safe areanon-safe area设备的两个设备都可以使用。

@objc func keyboardWillShow(notification: Notification) {
    guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }    
    let keyboardHeight: CGFloat                    
    if #available(iOS 11.0, *) {
       let window = UIApplication.shared.keyWindow
       let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
       keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
    } else {
       keyboardHeight = keyboardFrame.cgRectValue.height
    }
}