【问题标题】:Move the screen with keyboard用键盘移动屏幕
【发布时间】:2018-06-15 10:47:55
【问题描述】:

我想在显示键盘时向上移动屏幕,在隐藏键盘时移动到底部。

我使用这个代码:

override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

@objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0{
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }

    @objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y != 0{
                self.view.frame.origin.y += keyboardSize.height
            }
        }
    }

但我有这个问题:http://gph.is/2AvLo1A

在这个屏幕上,我点击 textField 以显示键盘并点击空白空间以隐藏键盘几次。我的屏幕往下爬,黑色的背景填满了整个屏幕。如何解决?

更新:

http://gph.is/2F7nux5

显示键盘后,底部有新的空白区域。如果我滚动我可以看到它:https://imgur.com/a/fFyEC

【问题讨论】:

    标签: ios swift uiview keyboard


    【解决方案1】:

    将滚动视图的底部约束挂钩到超级视图的底部并将其拖动为 IBOutlet 并执行此操作

     @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    
              self.scrollviewBottomCon.constant = keyboardSize.height
              self.view.layoutIfNeeded()
              self.scrollView.scrollRectToVisible((self.textfeild.frame), animated: true)
        }
    }
    
    @objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    
                self.scrollviewBottomCon.constant = 0
    
                self.view.layoutIfNeeded()
        }
    }
    

    【讨论】:

    • 在这种情况下,我的键盘覆盖了 textField。但是在几次显示键盘之后,我在底部有很多空白空间。
    • 这个视图是主视图控制器视图还是其中的子视图
    • 试着让 textfeild 上下而不是它的父视图
    • 查看 --> 滚动查看 --> 内容查看 --> 我的内容
    • 内容向上移动几个像素,但键盘也渴望文本字段。
    【解决方案2】:

    尽量不要上下移动整个视图,而是你真正需要移动的组件。我建议使用视图来包含您要移动的元素。

    我有一个用例,我在容器视图下方有一个 coupe 文本字段和一个提交按钮。当键盘出现时,我希望两个文本字段和按钮上升。以下是我的处理方式。

    @objc func keyboardWillAppear(_ notification: NSNotification) {
        if let userInfo = notification.userInfo,
            let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
    
            // Calculate how much to move
            let submitButtonHeight = self.submitButton.frame.size.height
            var submitButtonOrigin = self.view.convert(self.submitButton.frame.origin, from: self.containerView)
            submitButtonOrigin.y = submitButtonOrigin.y + submitButtonHeight + 4.0
            var visibleRect = self.view.frame
            visibleRect.size.height -= keyboardFrame.height
    
            // If keyboard covers the button, move the container up
            if !visibleRect.contains(submitButtonOrigin) {
                let keyboardMove = submitButtonOrigin.y - visibleRect.size.height
                if keyboardMove > 0 {
                    UIView.animate(withDuration: 0.3) {
                        self.containerView.transform = CGAffineTransform(translationX: 0, y: -keyboardMove)
                    }
                }
            }
        }
    }
    
    @objc func keyboardWillDisappear(_ notification: NSNotification) {
        UIView.animate(withDuration: 0.3) {
            self.containerView.transform = CGAffineTransform.identity
        }
    }
    

    这可能是也可能不是您的解决方案,但可以提供另一种选择。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多