【问题标题】:Getting keyboard height on custom keyboard is 0在自定义键盘上获取键盘高度为 0
【发布时间】:2019-04-09 19:36:49
【问题描述】:

像这里的许多其他线程一样,我需要将视图向上移动,以便在键盘可见时可见,并且在大多数情况下正确答案似乎是这样的:

var isKeyboardVisible = false

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}

@objc func keyboardWillShow(notification: NSNotification) {
    if !isKeyboardVisible {
        if let keyboardRectValue = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardRectValue.height
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardHeight
            }
        }

        isKeyboardVisible = true
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if isKeyboardVisible {
        if let keyboardRectValue = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardRectValue.height
            if self.view.frame.origin.y != 0 {
                self.view.frame.origin.y += keyboardHeight
            }
        }
        isKeyboardVisible = false
    }
}

但是,如果用户使用自定义键盘,这将不起作用。 如果使用自定义键盘,keyboardHeight 为 0。但如果使用普通键盘,高度似乎是正确的。

如果您安装 Google GBoard 并尝试获取键盘的高度,则可以重现。

我很确定我不是唯一一个使用自定义键盘的人,所以我想应该有某种解决方案来解决这个问题,它是动态的并且不包括长的 if/else 列表。

附加 1: 我发现 this 答案建议在文本字段中添加 inputAccessoryView。这对我来说很有意义,因为这个视图总是正好在键盘上方。这有两个问题。

第一,内容仍然隐藏在键盘后面。 二,如果当前聚焦的文本字段位于键盘后面,我是否应该将它的副本添加到“inputAccessoryView”,以便两者都显示所写的内容?这似乎是很多额外的工作。

whatsapp 之类的应用程序如何解决这个问题?必须有一种通用的方法来调整内容以适应任何键盘(库存或自定义)并且不会消失在屏幕顶部上方!?!?

【问题讨论】:

  • 这似乎是自定义键盘的常见问题,请参阅:stackoverflow.com/questions/36033153/…。看起来它发送了 3 次 keyboardWillShow 通知,最后一次调用包含实际高度。
  • @just_user 使用的是库。这将解决您的问题。 github.com/hackiftekhar/IQKeyboardManager
  • 感谢@Rahuld。那将是我的后备计划。首先,我希望有一个更优雅、更简单的解决方案。
  • @just_user 这个库很简单,你只需要在应用委托中写一行代码。
  • @Rahuld 是的,但它就像魔法一样。我想知道如何通过代码解决。

标签: ios swift ios12 swift4.2


【解决方案1】:

所以这是我找到的最干净的方法。

斯威夫特 4.2

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardShowHide), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardShowHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardShowHide), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

}


@objc func keyboardShowHide(notification: NSNotification) {
    if let keyboardRectValue = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        self.view.frame.size.height = UIScreen.main.bounds.height - keyboardRectValue.height
    }
}

在键盘上方获得必要视图的许多解决方案是将所有内容向上移动并超出屏幕限制。我认为这是一种不好的做法,只要键盘可见,屏幕外的用户就完全无法访问内容。

在我上面的解决方案中,我更喜欢调整内容的大小而不是移动它。因此,如果内容在 tableview 或 scrollview 中,则在键盘可见时所有内容仍然可用。

如果您更喜欢这种方法,只需更改此行:

self.view.frame.size.height = UIScreen.main.bounds.height - keyboardRectValue.height

为此:

self.view.frame.origin.y = -keyboardRectValue.height

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 2017-04-20
    • 2017-01-30
    • 2016-04-25
    • 2015-05-06
    • 2012-09-12
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多