在文本视图之间切换时,不同的键盘高度会产生奇怪的框架
Posted
技术标签:
【中文标题】在文本视图之间切换时,不同的键盘高度会产生奇怪的框架【英文标题】:Different keyboard heights make weird frames when switching between text view 【发布时间】:2017-05-16 15:20:57 【问题描述】:我有一个获取电子邮件和密码的登录屏幕。密码文本字段是安全的,它会导致不同的键盘高度。当我在电子邮件文本字段和密码字段之间切换时,没有先关闭键盘(在显示电子邮件键盘时单击密码),我的框架不会重新计算键盘高度,并且在两者之间的差异区域中出现黑色键盘。
这是在我的视图控制器中处理键盘的代码,很明显,问题在于 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)
我正在寻找一种可以解决这种情况的方法,也许当我单击密码字段时,它会首先关闭电子邮件字段键盘,然后打开密码键盘。 任何帮助表示赞赏。
【问题讨论】:
在keyboardWillHide
为什么不直接将原点设置回0而不是增加键盘高度?
@paulvs 听起来是个不错的方向,但我不确定我是否理解如何实现它
好的,这实际上解决了我遇到的一些奇怪问题,但仍然没有完全解决问题。谢谢
【参考方案1】:
主要问题是您使用的是相对偏移量(添加和减去视图的原点),而不是设置绝对值。这与一些不必要的原产地检查相结合,导致了差距。试试这个:
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
【讨论】:
这确实有效,但是当框架发生变化时,我会看到一秒钟的黑点。有没有办法克服这个问题? 是的,还有一个key,类似于UIKeyboardFrameBeginUserInfoKey
,叫做UIKeyboardAnimationDurationUserInfoKey
。这是一个Double
,它将为您提供键盘的动画持续时间。然后,将调整原点的代码包装在一个动画块中,并以此值作为其持续时间。以上是关于在文本视图之间切换时,不同的键盘高度会产生奇怪的框架的主要内容,如果未能解决你的问题,请参考以下文章