代码之家  ›  专栏  ›  技术社区  ›  user

用键盘移动屏幕

  •  1
  • user  · 技术社区  · 7 年前

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

    我使用此代码:

    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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Shehata Gamal    7 年前

    将scrollview的底部约束挂接到SuperView的底部,并将其作为IBMoutlet拖动,然后执行此操作

     @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()
        }
    }
    
        2
  •  0
  •   Derek    7 年前

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

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

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

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