UIKeyboard Notification.userInfo Xcode 9 中的关键错误

UIKeyboard Notification.userInfo Key bug in Xcode 9

  @objc func keyboardWasShown(_ notification:NSNotification)  {

    var userinfo = notification.userInfo!

    let kbSize:NSValue =  userinfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue

    let kbRectSize = kbSize.cgRectValue

    let edgeInsects = UIEdgeInsetsMake(0, 0,kbRectSize.height + 10, 0)

    self.scrollView.contentInset = edgeInsects
    self.scrollView.scrollIndicatorInsets = edgeInsects



    // active text field

    var aRect:CGRect = self.view.frame
    aRect.size.height -= kbRectSize.height


    if(!aRect.contains(activeField.frame.origin)){
        scrollView.isScrollEnabled = true
    scrollView.scrollRectToVisible(activeField.frame, animated: true)
        aRect = CGRect.zero
    }
}

滚动视图将按预期第一次滚动,然后变得无响应。 代码在 Xcode 8.3 之前工作正常,没有任何问题。

请提前确认是否是BUG以及如何规避it.Thanks

我也遇到了同样的问题,通过进行一些更改,它运行良好。在你的场景中尝试下面的代码,看看它是否有效:

@objc func keyboardWasShown(_ notification:NSNotification)  {

  var keyboardHeight: CGFloat = 260

  var userinfo = notification.userInfo!

  let keyboardSize = (userinfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size

  if keyboardSize!.height > 10.0{
      keyboardHeight = keyboardSize!.height
  }

  let edgeInsects = UIEdgeInsetsMake(0, 0, keyboardHeight + 10, 0)

  self.scrollView.contentInset = edgeInsects
  self.scrollView.scrollIndicatorInsets = edgeInsects

  // active text field

  var aRect:CGRect = self.view.frame
  aRect.size.height -= kbRectSize.height

  if(!aRect.contains(activeField.frame.origin)){
      scrollView.isScrollEnabled = true
      scrollView.scrollRectToVisible(activeField.frame, animated: true)
      aRect = CGRect.zero
  }
}

我在我的注册屏幕项目中使用了以下代码,它工作得很好:

func keyboardWasShown(notification: NSNotification){
    //Need to calculate keyboard exact size due to Apple suggestions
    var keyboardHeight: CGFloat = 260

    self.scrollView.isScrollEnabled = true

    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    if keyboardSize!.height > 10.0{
        keyboardHeight = keyboardSize!.height
    }

    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardHeight

    if let activeField = self.activeField {
        if (!aRect.contains(activeField.frame.origin)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}

func keyboardWillBeHidden(notification: NSNotification){
    //Once keyboard disappears, restore original positions

    self.scrollView.contentInset = UIEdgeInsets.zero
    self.scrollView.scrollIndicatorInsets = UIEdgeInsets.zero
    self.scrollView.isScrollEnabled = false

}

只需根据您的要求进行更多更改并尝试调试即可。希望它有效。

                    // ==== solution  =====//
          // ==== USE UIKeyboardFrameEndUserInfoKey ===

    // as UIKeyboardFrameBeginUserInfoKey return height as  0 for some 
      //reason on second call onwards , some weird bug indeed.


    var userinfo = notification.userInfo!

                        // === bug fix =====
    let kbSize:NSValue =  userinfo[UIKeyboardFrameEndUserInfoKey] as! NSValue

    let kbRectSize = kbSize.cgRectValue

    let edgeInsects = UIEdgeInsetsMake(0, 0,kbRectSize.height + 10, 0)

    self.scrollView.contentInset = edgeInsects
    self.scrollView.scrollIndicatorInsets = edgeInsects


    // active text field

    var aRect:CGRect = self.view.frame
    aRect.size.height -= kbRectSize.height

    if(!aRect.contains(activeField.frame.origin)){
        scrollView.isScrollEnabled = true
        scrollView.scrollRectToVisible(activeField.frame, animated: true)
        aRect = CGRect.zero
    }

找到解决方案,在 Xcode 9 中,键盘通知 userInfo 字典的键值对似乎有一些变化。

使用 UIKeyboardFrameEndUserInfoKey 代替 UIKeyboardFrameBeginUserInfoKey,

由于某些原因,作为 UIKeyboardFrameBeginUserInfoKey 的值在第二次调用时 return 键盘大小不正确。