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

时间:2018-11-06 11:55:20

标签: ios swift ios12 swift4.2

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

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之类的应用程序如何解决此问题?必须有一种通用的方法来调整内容使其适合任何键盘(普通或自定义)上方,并且也不会消失在屏幕顶部上方!?!?

1 个答案:

答案 0 :(得分:0)

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

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