【问题标题】:How can I move the whole view up when the keyboard pop up? (Swift)键盘弹出时如何向上移动整个视图? (迅速)
【发布时间】:2019-03-20 21:31:59
【问题描述】:

底部的灰色框是文本视图。当我点击文本视图时,键盘将从底部弹出。但是,文本视图已被弹出键盘覆盖。

我应该添加哪些功能才能在键盘弹出时向上移动整个视图?

【问题讨论】:

标签: swift


【解决方案1】:

要检测键盘何时出现,您可以收听NSNotificationCenter

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: “keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)

这将调用keyboardWillShowkeyboardWillHide。在这里你可以用你的UITextfield做你想做的事

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            //use keyboardSize.height to determine the height of the keyboard and set the height of your textfield accordingly
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    //pull everything down again
}

【讨论】:

    【解决方案2】:

    正如 Milo 所说,要自己执行此操作,您需要注册键盘显示/隐藏通知。

    然后,您需要编写代码来确定键盘隐藏了多少屏幕,以及相关字段在屏幕上的高度,这样您就知道要改变多少视图。

    完成此操作后,您要执行的操作取决于您是使用 AutoLayout 还是自动调整大小的遮罩(也称为“Struts and springs”样式布局。)

    我写了一篇关于一个项目的开发者博客文章,其中包含用于移动键盘的工作代码。看这个链接:

    http://wareto.com/animating-shapes-using-cashapelayer-and-cabasicanimation

    在该帖子中,查找底部标题为“滑动视图为键盘腾出空间”的链接。

    【讨论】:

      【解决方案3】:

      Swift 4 完整解决方案。

      我在所有需要它的项目中都使用它。

      在 viewWillAppear 上注册以侦听键盘显示/隐藏,并使用以下功能上下移动视图。

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
      
          subscribeToKeyboardNotifications()
      }
      
      // stop listening for changes when view is dissappearing
      override func viewWillDisappear(_ animated: Bool) {
          super.viewWillDisappear(animated)
          unsubscribeFromKeyboardNotifications()
      }
      
      // listen for keyboard show/show events
      func subscribeToKeyboardNotifications() {
          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)
      }
      
      func unsubscribeFromKeyboardNotifications() {
          NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
          NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
      }
      
      @objc func keyboardWillHide(_ notification: Notification) {
          view.frame.origin.y = 0
      }
      

      在我的情况下,我在底部有一个文本字段,它被键盘隐藏,所以如果正在使用它,那么我将视图向上移动

      @objc func keyboardWillShow(_ notification: Notification) {
          if bottomTextField.isFirstResponder {
              view.frame.origin.y = -getKeyboardHeight(notification: notification)
          }
      }
      
      func getKeyboardHeight(notification: Notification) -> CGFloat {
          let userInfo = notification.userInfo
          let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
          return keyboardSize.cgRectValue.height
      }
      

      【讨论】:

        【解决方案4】:

        斯威夫特 4

        这段代码不是那么完美,但值得一试!

        首先将整个视图嵌入到一个滚动视图中。

        将这个可爱的小函数添加到你的类中:

        @objc func keyboardNotification(_ notification: Notification) {
            if let userInfo = (notification as NSNotification).userInfo {
                let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
                let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
                let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
                let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions().rawValue
                let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
                if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
                    scrollViewBottomConstraint?.constant = 0
                } else {
                    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                        let keyboardHeight:Int = Int(keyboardSize.height)
                        scrollViewBottomConstraint?.constant = CGFloat(keyboardHeight)
                        scrollView.setContentOffset(CGPoint(x: 0, y: (scrollViewBottomConstraint?.constant)! / 2), animated: true)
                    }
                }
                UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve, animations: {
                    self.view.layoutIfNeeded()
                }, completion: nil)
            }
        }
        

        .

        将此添加到您的 ViewDidLoad:

        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
        

        不要忘记将滚动视图的底部约束连接到您的类(名称:“scrollViewBottomConstraint”)。

        【讨论】:

          猜你喜欢
          • 2016-04-13
          • 2018-05-21
          • 2015-11-29
          • 1970-01-01
          • 2016-05-07
          • 1970-01-01
          • 2012-07-25
          • 1970-01-01
          相关资源
          最近更新 更多