Search code examples
iosswiftkeyboardscrollview

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

The scrollview will scroll for first time as intended and then becomes unresponsive. The code was working fine until Xcode 8.3 without any issues.

please confirm whether it's a bug or not and how to circumvent it.Thanks in advance.


Solution

  •                     // ==== 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
        }
    

    Solution Found , in Xcode 9, there seems to be some change in key - value pairs of Keyboard notification userInfo dictionary.

    Use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey,

    As Value for UIKeyboardFrameBeginUserInfoKey for some reason does not return the proper size of the keyboard on second call onwards.