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

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,它将为您提供键盘的动画持续时间。然后,将调整原点的代码包装在一个动画块中,并以此值作为其持续时间。

以上是关于在文本视图之间切换时,不同的键盘高度会产生奇怪的框架的主要内容,如果未能解决你的问题,请参考以下文章

React Native:键盘在调整其视图高度时阻止多行文本输入

动画期间键盘和文本视图之间的间隙

iOS键盘监听以及获取键盘高度

-Roblox- 在播放器和部件之间切换时出现某种相机故障

iOS:在文本字段之间自动切换

使用动态高度将视图固定到底部