iOS开发:点击弹窗外部含按钮文本框不劫持原有事件关闭弹窗实现
解决方案
核心修改点有两个:
- 修改点击手势的属性,设置不拦截原有视图的触摸事件
- 实现手势代理方法,过滤弹窗内部的点击事件
代码修改步骤
第一步:调整手势属性
找到viewDidLoad中添加点击手势的代码段,新增cancelsTouchesInView配置:
let viewTapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped)) viewTapGesture.delegate = self // 新增:手势识别成功后不取消传递给原有视图的触摸事件 viewTapGesture.cancelsTouchesInView = false view.addGestureRecognizer(viewTapGesture)
第二步:实现手势代理过滤逻辑
在当前ViewController类中新增UIGestureRecognizerDelegate的实现方法:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { // 弹窗未展示时不响应手势 guard let popup = popup, !popup.isHidden else { return false } // 点击位置在弹窗内部时不响应手势,避免点击弹窗内容也触发关闭 let touchPos = touch.location(in: self.view) return !popup.frame.contains(touchPos) }
效果说明
修改后点击弹窗外部任意区域(包括按钮、文本框等自带交互的组件)都会触发弹窗关闭逻辑,同时原有组件的点击/输入事件会正常响应,不会被拦截。
内容的提问来源于stack exchange,提问作者Kaplan
相关产品推荐
相关产品推荐

