【问题标题】:On selecting a textfield, adjust view height for keyboard在选择文本字段时,调整键盘的视图高度
【发布时间】:2017-03-15 00:33:51
【问题描述】:

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

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

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

当用户选择UITextField 时,我已按照Apple documentation 中的步骤向上或向下滚动,以便键盘不在UITextField 之上。

当显示键盘时,scrollview 向上滚动,但当键盘隐藏时,scrollview 不会向后滚动。任何帮助表示赞赏。

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

【问题讨论】:

    标签: ios swift uiscrollview autolayout xib


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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
      }
      

      【讨论】:

      • 我已经按照建议修改了我的 keyboardWillBeHidden 功能,但我仍然没有看到滚动视图返回到之前的位置。
      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 2023-04-11
      • 1970-01-01
      • 2020-09-14
      • 2021-09-02
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多