iOS开发:如何判断外接硬件键盘是否处于激活状态?
如何判断外接硬件键盘的激活状态
这个问题问得很到位!我之前做iOS项目时刚好遇到过类似需求,给你分享几个实用的方案:
方案一:监听输入模式变化通知 + 系统硬件键盘状态API
iOS 13及以后提供了直接判断外接键盘是否连接的API,结合输入模式变化通知,可以精准捕获键盘状态的切换:
- 首先注册
UITextInputMode.currentInputModeDidChangeNotification通知,这个通知会在用户切换输入方式(包括外接键盘/软键盘切换、输入法切换)时触发。 - 在通知回调里,通过
UIApplication.shared.isHardwareKeyboardAttached属性判断当前是否有外接键盘激活。
示例代码:
override func viewDidLoad() { super.viewDidLoad() // 注册输入模式变化通知 NotificationCenter.default.addObserver( self, selector: #selector(onInputModeChanged), name: UITextInputMode.currentInputModeDidChangeNotification, object: nil ) } @objc private func onInputModeChanged() { let isHardwareKeyboardActive = UIApplication.shared.isHardwareKeyboardAttached if isHardwareKeyboardActive { print("外接硬件键盘已激活") // 这里执行你的业务逻辑,比如调整布局、隐藏软键盘相关的UI等 } else { print("外接键盘已断开或切换回软键盘") // 处理对应的状态变化逻辑 } } // 记得在deinit里移除通知 deinit { NotificationCenter.default.removeObserver(self) }
方案二:结合文本视图的编辑状态 + 硬件键盘检查
如果需要在用户开始编辑文本视图时立刻判断外接键盘状态,可以结合UITextViewDelegate的方法:
extension YourViewController: UITextViewDelegate { func textViewDidBeginEditing(_ textView: UITextView) { // 延迟一小段时间确保系统状态更新完成 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { let isHardwareActive = UIApplication.shared.isHardwareKeyboardAttached if isHardwareActive { print("用户开始编辑时,外接键盘处于激活状态") } } } }
兼容iOS 13以下版本的变通方案
如果你的项目需要支持iOS 13之前的系统,没有isHardwareKeyboardAttached这个API,可以用以下不太完美但可用的方法:
- 当
UITextView成为第一响应者后,若在短时间内没有收到UIKeyboardWillShowNotification通知,大概率是用户使用了外接键盘(注意:这个方法在iPad分屏等特殊场景下可能不准确,仅作为降级方案)。
注意事项
isHardwareKeyboardAttached仅表示外接键盘是否物理连接,当用户连接了外接键盘但手动切换回软键盘时,这个属性仍然为true,这时候需要结合输入模式变化通知来判断实际使用的键盘类型。- 在外接键盘和软键盘之间切换时,
UITextInputMode.currentInputModeDidChangeNotification会可靠触发,所以通过这个通知来监听状态变化是最稳妥的方式。
内容的提问来源于stack exchange,提问作者newszer
相关产品推荐
相关产品推荐

