You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:点击弹窗外部含按钮文本框不劫持原有事件关闭弹窗实现

解决方案

核心修改点有两个:

  1. 修改点击手势的属性,设置不拦截原有视图的触摸事件
  2. 实现手势代理方法,过滤弹窗内部的点击事件

代码修改步骤

第一步:调整手势属性

找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:45:00