像这里的许多其他线程一样,我需要向上移动一个 View ,以便在键盘可见时它可见,并且在大多数情况下正确答案似乎是这样的:
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
添加到文本字段的答案。这对我来说非常有意义,因为这个 View 将始终恰好位于键盘上方。这有两个问题。
第一,内容仍然隐藏在键盘后面。 第二,如果当前聚焦的文本字段在键盘后面,我是否应该将它的副本添加到“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
}
}
在键盘上方获得必要 View 的许多解决方案是将所有内容向上移动并超出屏幕限制。我认为这是一种不好的做法,只要键盘可见,屏幕外的用户就完全无法访问内容。
在我上面的解决方案中,我更喜欢调整内容的大小而不是移动它。因此,如果内容在 tableview 或 scrollview 中,则在键盘可见时所有内容仍然可用。
如果您更喜欢这种方法,只需更改此行:
self.view.frame.size.height = UIScreen.main.bounds.height - keyboardRectValue.height
为此:
self.view.frame.origin.y = -keyboardRectValue.height
关于ios - 在自定义键盘上获取键盘高度为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53171412/