Swift键盘首次获取高度正常,再次唤起返回0的问题求助
解决iOS键盘收起后再次唤起高度为0的问题
我看了你的代码,问题主要出在两个地方:重复注册键盘通知观察者和使用了错误的键盘frame获取键,这两个问题叠加导致了第二次唤起键盘时高度为0的情况。下面是具体的分析和修复方案:
问题原因拆解
- 重复添加观察者:你每次点击
showCaseProgressSliderBtn按钮时都会调用NotificationCenter.default.addObserver,这会导致同一个观察者被注册多次。当键盘唤起时,keyboardWillShow会被触发多次,后续的重复注册还可能导致回调逻辑混乱。 - 错误的frame键:你用了
UIKeyboardFrameBeginUserInfoKey,这个键获取的是键盘开始显示动画时的frame。如果键盘之前已经被唤起过(比如收起后快速再次唤起),这个值可能不是键盘最终显示的真实高度,甚至会返回0。
修复后的完整代码
override func viewDidLoad() { super.viewDidLoad() // 只在视图加载时注册一次键盘通知,避免重复注册 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) } @IBAction func showCaseProgressSliderBtn(_ sender: Any){ // 这里只处理按钮点击的核心逻辑,比如唤起输入框 // 示例:如果是要让某个输入框弹出键盘,直接调用becomeFirstResponder即可 // yourInputTextField.becomeFirstResponder() } @objc func keyboardWillShow(notification: NSNotification) { // 使用UIKeyboardFrameEndUserInfoKey获取键盘动画结束后的最终frame,这才是真实的键盘高度 if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { let keyboardHeight = keyboardSize.height keyboardHeightCG = keyboardHeight print("keyboard height: \(keyboardHeightCG)") } } @objc func keyboardWillHide(notification: NSNotification) { // 可选:键盘隐藏时重置高度,保持状态一致 keyboardHeightCG = 0 print("keyboard has been hidden") } deinit { // 在视图销毁时移除观察者,防止内存泄漏 NotificationCenter.default.removeObserver(self) }
关键修改点说明
- 统一注册通知:把通知注册移到
viewDidLoad,确保整个生命周期内只注册一次,避免重复回调的问题。 - 替换frame键:用
UIKeyboardFrameEndUserInfoKey替代UIKeyboardFrameBeginUserInfoKey,它能准确获取键盘完全显示后的高度,不管是第一次还是后续唤起都能拿到正确的值。 - 添加隐藏回调:新增
keyboardWillHide方法来处理键盘隐藏的状态,让你的高度变量保持准确。 - 移除观察者:在
deinit里移除观察者,避免内存泄漏,这是iOS开发的最佳实践。
这样修改后,不管你多次收起、唤起键盘,都能正确获取到键盘的真实高度了。
内容的提问来源于stack exchange,提问作者Mahmoud
相关产品推荐
相关产品推荐

