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


84

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

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

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

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

在这种情况下会发生什么问题?我正在使用xcode 9 Beta 5

Answers:


190

用这个:

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

对于Swift,您可以使用:

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

1
您拯救了我的一天
Helen Zhukova

1
谢谢,永远不会想到这一点
Ammar Hadzic

5
从UIKeyboardFrameBeginUserInfoKey更改为UIKeyboardFrameEndUserInfoKey可以达到目的。
user2408952

谢谢,我花了半天时间,但不知道。感谢您保存我的另一半天。
Manish Nahar

@Akshay只是在相应的屏幕范围内,键盘的开始帧和结束帧。
s.zainulabideen

102

更换 UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

以下来自Apple Docs。

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

UIKeyboardFrameEndUserInfoKey-包含CGRect的NSValue对象的键,该CGRect在屏幕坐标中标识键盘的末端框架。


13
苹果需要更新他们的示例代码,然后,因为它不会再在iOS 11.还从苹果的文档,在那里他们使用UIKeyboardFrameBeginUserInfoKey工作:developer.apple.com/library/content/documentation/...
wildcat12

解决了我的问题!谢谢你的建议!
厄尼(Ernie)

有人可以像我五岁那样向我解释这两者之间的区别是什么,为什么要使UIScrollView自动滚动会有所不同?我真的很感激。谢谢!
马里奥(Mario)

用numPad轻按到文本字段后,它不起作用。如果在numPad之后我点击了常规文本框,键盘不再向上移动,并且当它关闭视图时,向下滑动
Jack Daniel

7

试试这个:

替换UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];方法KeyboardWillChangeFrame:不仅运行一次,可能两次或多次。也许某些键盘有时在顶部具有特殊的工具栏,该方法此时将运行多次。因此,应将UIKeyboardFrameBeginUserInfoKey替换为UIKeyboardFrameEndUserInfoKey以获得最后一帧键盘。
SolinLiu

5

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

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    let heightValue = keyboardSize.height    

    ...
}

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

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


1
我注意到了同样的事情。它似乎也仅适用于键盘显示的第一次。其他视图控制器上的键盘在第一次显示该视图控制器时报告高度为0。
jackofallcode

5

此问题在iOS 11上发生。

更换

“ UIKeyboardFrameBeginUserInfoKey”和“ 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

3

使用以下代码计算键盘高度。

它适用于带有安全区域设备和非安全区域设备的设备。

码:

@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
    }
}

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
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.