当iOS显示/隐藏键盘时,我正在努力移动我的视图。 (抱歉,不知道如何格式化代码突出显示)
我实施了以下观察员:
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
这些功能:
func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y != 0 {
self.view.frame.origin.y += keyboardSize.height/2
}
}
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y == 0 {
self.view.frame.origin.y -= keyboardSize.height/2
}
}
}
我添加了一个扩展名:
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
view.endEditing(true)
}
}
所以这一切都很好。 但是,一旦键盘认为显示单词建议是个好主意,我就会遇到问题。键盘越来越高,视图向下徘徊太远。 这种情况主要发生在用户从仅限数字键盘切换到另一个文本字段时,它是普通键盘(有时带有建议)。 那么,有没有办法知道键盘当前是否显示单词建议(或其他任何“正常”高度偏差)? 我想过将全局变量用于 keyboardWillShow 功能的键盘高度,但这不起作用,因为当它们在具有不同键盘高度的文本字段之间切换时,我会移动到远或更少(参见数字垫)。 任何帮助都非常感谢!提前谢谢!
编辑: 啊!我认为将 willShowKeyboard - 高度存储在全局变量中并将其与 willHideKeyboard - 高度进行比较可能会有效。我仍然愿意接受更顺畅的解决方案!
答案 0 :(得分:0)
关键UIKeyboardFrame 开始 UserInfoKey没有为您提供最终尺寸 - 正如名称提示"开始"。
相反,请尝试使用它的姐妹UIKeyboardFrame 结束 UserInfoKey - 这将在结束动画后为您提供键盘的最终尺寸。
请注意,它不会将轮换纳入帐户https://developer.apple.com/reference/uikit/uikeyboardframeenduserinfokey
答案 1 :(得分:-1)
我结束了将keyboardHeight从 keboardWillShow 存储到全局变量中,然后将该变量移回 keboardWillHide 。我正在检查最后一个keyboardHeight是否等于当前移动我的视图(如果需要)。 不太漂亮但是,嘿,它有效!
// keyboardHeight is a global var.
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y == 0 ||
(keyboardHeight != keyboardSize.height/2)
{
self.view.frame.origin.y = 0
self.view.frame.origin.y -= keyboardSize.height/2
keyboardHeight = keyboardSize.height/2
}
}
}
func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
_ = keyboardSize.height/2 // to surpress warnings...
if self.view.frame.origin.y != 0 {
self.view.frame.origin.y += keyboardHeight //keyboardSize.height/2
}
}
}
我不知道 keyboardWillShow 中的 self.view.frame.origin.y = 0 。我想我会考虑只将其移动差异而不是每次都设置为0。但是现在每个人都应该按照自己的意愿行事。