Swift 在文本视图之间切换时,不同的键盘高度会产生奇怪的帧
我有一个登录屏幕,可以获取电子邮件和密码。密码文本字段是安全的,其结果是不同的键盘高度。当我在email文本字段和password字段之间切换时,在显示email键盘的同时,在不关闭键盘的情况下,首先单击密码,我的框架不会重新计算键盘高度,键盘之间的差异区域会显示黑色。 这是在“我的视图”控制器中处理键盘的代码,很明显,问题在于不会再次调用键盘HIDE/show func,并且如果没有取消它们,则计算帧的正确高度:Swift 在文本视图之间切换时,不同的键盘高度会产生奇怪的帧,swift,uikeyboard,Swift,Uikeyboard,我有一个登录屏幕,可以获取电子邮件和密码。密码文本字段是安全的,其结果是不同的键盘高度。当我在email文本字段和password字段之间切换时,在显示email键盘的同时,在不关闭键盘的情况下,首先单击密码,我的框架不会重新计算键盘高度,键盘之间的差异区域会显示黑色。 这是在“我的视图”控制器中处理键盘的代码,很明显,问题在于不会再次调用键盘HIDE/show func,并且如果没有取消它们,则计算帧的正确高度: private func setupKeyboard(){
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。这是一个双倍的,它将为您提供键盘的动画持续时间。然后,将调整动画块内原点的代码包装为该值作为其持续时间。