选择文本字段时,调整键盘的视图高度

On selecting a textfield, adjust view height for keyboard

我在 xib 中有一个 ViewController(登录视图),它有 2 个 UITextField 和 1 个 UIButton 组件。视图层次结构是

 UIView
     -> UIScrollView
         -> UIView (contentView)
             -> UITextField
             -> UITextField
             -> UIButton

我正在为视图使用自动布局。 UIScrollView 有 4 个约束,即前导、尾随、顶部和底部与其父视图(UIViewController 视图)对齐。 ContentView 有 4 个约束,即其超级视图 (UIScrollView) 的前导、尾随、顶部和底部以及宽度匹配 UIViewController 视图。

我已按照 Apple documentation 中的步骤在用户选择 UITextField 时向上或向下滚动,这样键盘就不会位于 UITextField.

之上

当显示键盘时,滚动视图向上滚动,但当键盘隐藏时,滚动视图不会向后滚动。感谢任何帮助。

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

func keyboardWillHide(notification: NSNotification) {

        let contentInsets: UIEdgeInsets = UIEdgeInsets.zero
        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets
    } 

func keyboardWillShow(notification: NSNotification) {

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

            let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

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

            var aRect = self.view.frame

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

这个键盘问题在苹果文档中有详细解释:

https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

或者,尝试以下代码:

func registerForKeyboardNotifications(){
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name:       NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name:    NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func deregisterFromKeyboardNotifications(){
   NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
   NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWasShown(notification: NSNotification){
   self.scrollView.isScrollEnabled = true
   var info = notification.userInfo!
   let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
   let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

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

   var aRect : CGRect = self.view.frame
   aRect.size.height -= keyboardSize!.height
   if let activeField = self.activeField {
       if (!aRect.contains(activeField.frame.origin)){
           self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
       }
   }
}

func keyboardWillBeHidden(notification: NSNotification){
   var info = notification.userInfo!
   let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
   let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)
   self.scrollView.contentInset = contentInsets
   self.scrollView.scrollIndicatorInsets = contentInsets
   self.view.endEditing(true)
   self.scrollView.isScrollEnabled = false
}

func textFieldDidBeginEditing(_ textField: UITextField){
   activeField = textField
}

func textFieldDidEndEditing(_ textField: UITextField){
   activeField = nil
}

滚动视图 contentInset.top 不是 0.0 因此我遇到了问题。在隐藏键盘后 contentInset.top 正确更改 scrollView 设置为原始位置后。

func keyboardWillShow(notification: NSNotification) {

        self.scrollView.isScrollEnabled = true

        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0.0, keyboardSize!.height, 0.0)

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

        var aRect : CGRect = self.view.frame
        aRect.size.height -= keyboardSize!.height
        if let activeField = self.activeField {
            if (!aRect.contains(activeField.frame.origin)){
                self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
            }
        }
    }