Swift 在文本视图之间切换时,不同的键盘高度会产生奇怪的帧

Swift 在文本视图之间切换时,不同的键盘高度会产生奇怪的帧,swift,uikeyboard,Swift,Uikeyboard,我有一个登录屏幕,可以获取电子邮件和密码。密码文本字段是安全的,其结果是不同的键盘高度。当我在email文本字段和password字段之间切换时,在显示email键盘的同时,在不关闭键盘的情况下,首先单击密码,我的框架不会重新计算键盘高度,键盘之间的差异区域会显示黑色。 这是在“我的视图”控制器中处理键盘的代码,很明显,问题在于不会再次调用键盘HIDE/show func,并且如果没有取消它们,则计算帧的正确高度: private func setupKeyboard(){

我有一个登录屏幕,可以获取电子邮件和密码。密码文本字段是安全的,其结果是不同的键盘高度。当我在email文本字段和password字段之间切换时,在显示email键盘的同时,在不关闭键盘的情况下,首先单击密码,我的框架不会重新计算键盘高度,键盘之间的差异区域会显示黑色。 这是在“我的视图”控制器中处理键盘的代码,很明显,问题在于不会再次调用键盘HIDE/show func,并且如果没有取消它们,则计算帧的正确高度:

    private func setupKeyboard(){
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
        view.addGestureRecognizer(tap)

        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 keyboardWillShow(notification: NSNotification){
        UIView.animate(withDuration: 2.0, animations: {
            self.appLogo.alpha = 0
        })
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0{
                self.view.frame.origin.y -= (keyboardSize.height)
            }
        }
    }
    func keyboardWillHide(notification: NSNotification){
        self.appLogo.alpha = 1
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y != 0{
                self.view.frame.origin.y += (keyboardSize.height)
            }
        }
    }

    func dismissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        appLogo.isHidden = false
        view.endEditing(true)
    }
我正在寻找一种方法来解决这种情况,也许当我点击密码字段时,它会首先丢失电子邮件字段键盘,然后打开密码键盘。
感谢您的帮助。

主要问题是您使用相对偏移量对视图原点进行加减,而不是设置绝对值。这加上一些不必要的原产地检查,造成了这种差距。试试这个:

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

在keyboardWillHide中,为什么不将原点设置回0,而不是添加键盘高度?@paulvs听起来是个不错的方向,不确定我是否理解如何实现itok这实际上解决了我遇到的一些奇怪问题,但仍然没有完全解决问题。谢谢这确实奏效了,但我在画面变化时看到了一秒钟的黑点。。有没有办法克服这个问题?是的,还有另一个键,类似于UIKeyboardFrameBeginUserInfo键,叫做UIKeyboardAnimationDurationUserInfoKey。这是一个双倍的,它将为您提供键盘的动画持续时间。然后,将调整动画块内原点的代码包装为该值作为其持续时间。