需求场景:
当用户输入完毕,通过点击空白处,快捷实现键盘收起;同时也不影响其他正常的交互操作。
在UIKit中隐藏键盘的方法
textField.resignFirstResponder()
view.endEditing(true)
本质上是需要获取到承载键盘的视图
SwiftUI添加方法
SwiftUI 没有之前 View 的概念了,但是同样可以获取到整个 App 的 window,从而调用 endEditing。
给 UIApplication 增加 Extension
// MARK: - 全局点击隐藏键盘分类
extension UIApplication {
public func addTapHideKeyBoardGesture() {
guard let window = windows.first else { return }
let tapGesture = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing))
tapGesture.requiresExclusiveTouchType = false
tapGesture.cancelsTouchesInView = false
tapGesture.delegate = self
window.addGestureRecognizer(tapGesture)
}
}
extension UIApplication: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true // 可以同时响应多个手势
}
}
requiresExclusiveTouchType
:默认为 true。这个属性是指是否允许多种手势输入,这里的多种包含触摸、遥控器、触控笔等,所以可以配置成 false
cancelsTouchesInView
:默认为 true。这里设置为 false,主要为了不影响其他手势的识别。当前的 tap 手势被识别出来之后,也不会触发 UITouch 的 cancel 方法,因此就不会中断 UITouch 的传递。
最后加上手势识别
.onAppear(perform: UIApplication.shared.addTapHideKeyBoardGesture)