解决方案比我想象的要容易。对于 iOS 9+ 系统,我们可以按照以下步骤访问系统键盘并监听按键...
首先,创建一个自定义UIGestureRecognizer来监听击键。跳过此步骤的实现,因为它很简单(只需覆盖touchesBegan, touchesMoved, touchesEnded)。
添加KeyboardManager以访问键盘视图:
final class KeyboardManager {
static let shared = KeyboardManager()
private init() { }
/// Returns keyboard view on application window
///
/// - Returns: Keyboard view
func keyboardView() -> UIView? {
for window in UIApplication.shared.windows {
if let keyboardView = keyboardViewFromWindow(window) {
return keyboardView
}
}
return nil
}
/// Returns keyboard view from given window
///
/// - Parameter window: Keyboard view container candidate window
/// - Returns: Keyboard view
func keyboardViewFromWindow(_ window: UIWindow) -> UIView? {
if window.hasClassNameSuffix("UIRemoteKeyboardWindow") {
let inputSetContainerView = window.subview(withSuffix: "InputSetContainerView")
let inputSetHostView = inputSetContainerView?.subview(withSuffix: "InputSetHostView")
return inputSetHostView
}
return nil
}
}
UIView上面使用的扩展函数:
@nonobjc extension UIView {
/// Returns first found subview with given class name
///
/// - Parameter className: Subview class name
/// - Returns: First subview with given class name
func subview(withSuffix className: String) -> UIView? {
return subviews.first {
$0.hasClassNameSuffix(className)
}
}
/// Compares suffix of view class name with given name
///
/// - Parameter className: Class name that will be compared
/// - Returns: Comparison result of view class name and given name
func hasClassNameSuffix(_ className: String) -> Bool {
return NSStringFromClass(type(of: self)).hasSuffix(className)
}
}
然后,使用以下函数将手势识别器添加到键盘视图:
KeyboardManager.shared.keyboardView()?.addGestureRecognizer(keyboardGestureRecognizer).
注意:您的手势识别器不应扩展UITapGestureRecognizer. UILongPressGestureRecognizer没关系。我们不能将多个具有相同类型的点击手势识别器添加到视图中。