You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift键盘首次获取高度正常,再次唤起返回0的问题求助

解决iOS键盘收起后再次唤起高度为0的问题

我看了你的代码,问题主要出在两个地方:重复注册键盘通知观察者和使用了错误的键盘frame获取键,这两个问题叠加导致了第二次唤起键盘时高度为0的情况。下面是具体的分析和修复方案:

问题原因拆解

  1. 重复添加观察者:你每次点击showCaseProgressSliderBtn按钮时都会调用NotificationCenter.default.addObserver,这会导致同一个观察者被注册多次。当键盘唤起时,keyboardWillShow会被触发多次,后续的重复注册还可能导致回调逻辑混乱。
  2. 错误的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:01