不同的键盘高度使文本视图之间切换时奇怪的框架

问题描述:

我有一个登录屏幕,获取电子邮件和密码。密码文本字段是安全的,并且其结果具有不同的键盘高度。当我在电子邮件文本字段和密码字段之间切换时,首先不关闭键盘(在提供电子邮件键盘时单击密码),我的框架不会重新计算键盘高度,并且在区域键盘。 这是处理键盘在我的视图控制器的代码,很明显的问题是,keyboardWillHide/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) 
    } 

我正在寻找一种方法来解决这种情况,也许当我点击密码字段时,它会先解除电子邮件字段的键盘,然后打开密码键盘。 任何帮助表示赞赏。

+0

在'keyboardWillHide'为什么不把原点设置回0而不是增加键盘高度? – paulvs

+0

@paulvs听起来像一个不错的方向,不知道我明白如何实现它 – Eyzuky

+0

好吧,这实际上解决了我有一些奇怪的问题,但仍然没有完全解决问题。谢谢 – Eyzuky

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

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 
    } 
} 
+0

这实际上工作,但我看到了黑色斑点一秒钟,而框架改变..有没有办法来克服呢? – Eyzuky

+1

是的,还有另一个关键字,类似于'UIKeyboardFrameBeginUserInfoKey',名为'UIKeyboardAnimationDurationUserInfoKey'。这是一个'双',它会给你键盘的动画持续时间。然后,将您的代码调整为动画块中的原点,并将此值作为其持续时间。 – paulvs