SwiftUI 添加全局点击隐藏键盘

需求场景:

当用户输入完毕,通过点击空白处,快捷实现键盘收起;同时也不影响其他正常的交互操作。

在UIKit中隐藏键盘的方法

  1. textField.resignFirstResponder()
  2. 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)
相关推荐
sweet丶2 小时前
iOS AI 编程环境配置:Agent、Skill、Rules、Hook、Command
ios·ai编程
2501_915909062 小时前
iOS应用性能优化:十大策略提升用户体验与开发效率
android·ios·小程序·https·uni-app·iphone·webview
白玉cfc6 小时前
【iOS】底层原理:分类、扩展和关联对象
ios·分类·数据挖掘
2601_955767427 小时前
观复盾护景贴:东方哲思与双护科技的深度实测
人工智能·科技·ios·iphone·圆偏振光·磁控溅射
会Tk矩阵群控的小木7 小时前
企业级iMessage群发系统实战:单主机管控多iPhone设备完整实现
运维·ios·开源软件·个人开发
人月神话-Lee8 小时前
【图像处理】vImage/Accelerate——SIMD 让 CPU 也能飞
图像处理·深度学习·ios·cnn·ai编程·swift
万能小林子8 小时前
如何将网页在线转APP?5种打包工具对比速成指南(含在线/手机/电脑方案)
android·ios·uni-app·web app·wap2app·app打包·app封装
2601_955767429 小时前
iPhone 17屏幕反光怎么解?磁控溅射AR膜实测反射率低至0.5%
ios·ar·iphone·#观复盾护景贴·scinique双护技术
东坡肘子9 小时前
稳定 > 新功能 -- 肘子的 Swift 周报 #138
人工智能·swiftui·swift
盼小辉丶9 小时前
PyTorch深度学习实战(56)——在iOS上构建PyTorch应用
pytorch·深度学习·ios