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)
相关推荐
诸葛亮的芭蕉扇1 小时前
iOS视频自动全屏问题解决方案
ios·音视频
Bug 挖掘机3 小时前
从0到1做出可复用的 iOS 自动化测试 Skill,附真机演示效果
自动化测试·测试开发·ios
掘根4 小时前
【微服务即时通讯】客户端通信连接
ios·iphone
00后程序员张4 小时前
完整指南 iOS App上架到App Store的步骤详解
macos·ios·小程序·uni-app·objective-c·cocoa·iphone
鹤卿1235 小时前
Block基础
开发语言·ios·objective-c
开开心心loky5 小时前
[OC 底层] (二)类与对象底层原理
macos·ios·objective-c·cocoa
ZZH_AI项目交付19 小时前
扫脸功能交给 SDK 后,主工程里的旧代码怎么删除
ios·app·apple
ZZH_AI项目交付20 小时前
扫脸功能做成 SDK,为什么我没有把结果页和历史记录一起搬进去
ios·app
茶底世界之下21 小时前
诡异!String 参数在闭包里变成了 <uninitialized>,我排查了整整两天
ios·xcode·swift
harder3211 天前
iOS IPA 马甲包送审风险评估工具
ios