在自定义键盘上获取键盘高度为0



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

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。但如果使用普通键盘,则高度似乎是正确的。

如果你安装谷歌GBoard并尝试获得键盘的高度,就可以复制。

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

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

第一,内容仍然隐藏在键盘后面。第二,如果当前关注的文本字段在键盘后面,我是否应该将其副本添加到"inputAccessoryView"中,以便写入的内容都显示在两者中?这似乎是很多额外的工作。

whatsapp这样的应用程序会做些什么来解决这个问题?必须有一种通用的方法来调整内容,使其适合任何键盘(库存或自定义(,并且不会消失在屏幕顶部!?!?

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

Swift 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
}
}

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

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

然而,如果你更喜欢这种方法,只需更改这一行:

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

为此:

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

最新更新