Swift:如何让UITapGestureRecognizer仅响应父视图点击以关闭页面
解决点击子视图触发父视图手势关闭页面的问题
你遇到的问题是因为UITapGestureRecognizer默认会响应子视图区域的点击事件,下面提供两种简单的解决方式:
方法一:在手势回调中判断点击区域
通过手势获取点击坐标,判断该坐标是否落在backgroundView之外,只有点击父视图空白区域时才执行关闭操作。
修改你的didTapOutsideBackgroundView方法:
@objc func didTapOutsideBackgroundView(sender: UITapGestureRecognizer) { let tapLocation = sender.location(in: view) // 将点击坐标转换为backgroundView坐标系下的点,判断是否在其范围内 let pointInBackgroundView = view.convert(tapLocation, to: backgroundView) if !backgroundView.point(inside: pointInBackgroundView, with: nil) { dismiss(animated: true) } }
方法二:让子视图拦截点击事件
给backgroundView添加一个空的手势识别器,它会直接消耗点击事件,不会传递到父视图的手势上。
在setupUI方法的末尾添加:
// 添加空手势拦截点击,避免触发父视图的关闭手势 let tapInterceptor = UITapGestureRecognizer() backgroundView.addGestureRecognizer(tapInterceptor)
两种方法对比:
- 方法一更灵活,适合需要自定义判断逻辑的场景
- 方法二更简洁,适合只需要子视图屏蔽父视图手势的场景
内容的提问来源于stack exchange,提问作者Alex171
相关产品推荐
相关产品推荐

