Swift 带键盘的快速移动视图

Swift 带键盘的快速移动视图,swift,uikeyboard,Swift,Uikeyboard,我试图在键盘出现时向上移动视图,在键盘隐藏时向下移动视图 我遇到的问题是高度似乎不同:KBH1输出216,KBH2输出260 这将导致视图向下移动的距离比最初移动的距离更远 我该如何纠正这一点 extension UIViewController { func addKeyboardFunctions() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #

我试图在键盘出现时向上移动视图,在键盘隐藏时向下移动视图

我遇到的问题是高度似乎不同:KBH1输出216,KBH2输出260

这将导致视图向下移动的距离比最初移动的距离更远

我该如何纠正这一点

extension UIViewController {

    func addKeyboardFunctions() {

        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboardEx))
       // tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: Notification.Name.UIKeyboardWillHide, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: Notification.Name.UIKeyboardWillShow, object: nil)
    }

    @objc func keyboardWillAppear(_ 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
                print("KBH: \(keyboardSize.height)")
            }
        }
    }

    @objc func keyboardWillDisappear(_ 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
                print("KBH: \(keyboardSize.height)")
            }
        }
    }

问题是您使用的是
UIKeyboardFrameBeginUserInfo

通知将为您提供开始帧和结束帧,因此您可以相应地移动视图。结束帧将是键盘动画结束的位置,因此它是最终位置。你应该用这个

我以前经常使用这个分机,我想它是给Swift 2的

func getKeyboardHeight(notification: NSNotification) -> CGFloat {
    let userInfo = notification.userInfo
    let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
    return keyboardSize.CGRectValue().height
}

您应该能够更新Swift 4,但最重要的部分是使用结束帧而不是开始

视图控制器是否嵌入在导航控制器中?嗨,不,它在嵌入的视图中它是否包含导航栏?不,我问的是导航栏,因为两者之间的高度差是44,这是导航栏的高度。我相信这与此有关。