键盘高度0

时间:2017-08-05 19:53:45

标签: ios swift keyboard nsnotificationcenter

我正在尝试在用户输入时将stackview移动到键盘上方。我使用以下代码来获取键盘的高度(取自Move view with keyboard using Swift)。

第一次出现键盘时,代码有效,keyboardSize.height打印出226.0。但是,当键盘在第一次之后重新出现时,keyboardSize.height会打印出0.0。因此,当键盘出现时,我无法一直向上移动我的stackview。有时候,代码会在第一次尝试后再次运行,但它不会持续超过一次,并且表现不一致。

当我打印出keyboardSize时,我第一次获得(0.0, 736.0, 414.0, 226.0)。第一次之后,keyboardSize打印出(0.0, 736.0, 414.0, 0.0),因此只有高度变得不正确。

我怎样才能始终如一地获得键盘的高度?为什么会出现这个问题?

override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue{
        print(keyboardSize.height)
        ...
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue{ ... }
}

3 个答案:

答案 0 :(得分:1)

使用此功能;

  

UIKeyboardFrameEndUserInfoKey

目标C;

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

答案 1 :(得分:0)

如果您使用输入附件视图显示键盘上方的堆栈视图,并且您将附件视图的canBecomeFirstResponder设置为true,那么当键盘出现时,它会给您原始高度,但是当您关闭键盘时,请关闭附件视图用法首先是键盘关闭通知和再次键盘打开通知功能。因此,你也将在关闭时获得键盘开放高度。在两个函数中使用断点来确认它并使用一些检查变量来解决您的问题。注意******必须阅读有关输入附件视图的最佳方法,以便在聊天应用中添加键盘上方的视图。

答案 2 :(得分:0)

使用此代码

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