当前位置: 首页 > news >正文

iOS 手势与控件事件冲突解决清单

总结一份「iOS 手势与控件事件冲突解决清单」,以后你遇到 UIButton / UITableView / UIScrollView 被手势拦截就能快速排查了:


📌 iOS 手势与控件事件冲突常见解决办法

1️⃣ cancelsTouchesInView

👉 最常用,决定手势识别后是否取消触摸传递给子视图。

tap.cancelsTouchesInView = NO;
  • YES (默认):手势识别成功后,子视图(按钮、cell)不会收到触摸。

  • NO:手势和子视图事件都能响应。


2️⃣ delaysTouchesBegan / delaysTouchesEnded

控制手势识别是否延迟控件事件:

tap.delaysTouchesBegan = NO;  // 默认 NO,立即分发事件
tap.delaysTouchesEnded = NO;  // 默认 NO,不延迟结束事件
  • 常用于 UIScrollView + TapGesture 冲突,避免滚动被 tap 卡住。


3️⃣ UIGestureRecognizerDelegate

通过代理「精准控制」哪些触摸点交给手势,哪些交给控件。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {if ([touch.view isKindOfClass:[UIButton class]]) {return NO; // 不拦截按钮}return YES;
}

或者用坐标判断(只在某些区域才识别手势)。


4️⃣ requireGestureRecognizerToFail

让一个手势等待另一个失败之后再执行。

[tap requireGestureRecognizerToFail:doubleTap];
  • 常见于 单击和双击冲突(比如播放器单击暂停、双击点赞)。


5️⃣ 控件自带的「手势优先级」

  • UIScrollView 本身有 pan 手势,会和自定义手势冲突。
    可用:

    gestureRecognizer.requireGestureRecognizerToFail(scrollView.panGestureRecognizer);
    
  • UITableViewCell 的选中事件属于 touch,会被 tap gesture 截获。此时用方法 1 或 3。


6️⃣ HitTest 重写 (更高级)

如果手势放在最外层,直接覆盖了内部视图,可以重写 hitTest:withEvent:,手动决定事件分发:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {if (CGRectContainsPoint(self.contentView.frame, point)) {return [super hitTest:point withEvent:event]; // 交给 contentView}return self; // 外部区域交给自己处理
}

🏷️ 常见场景速查

  • 点击空白处关闭弹窗 → cancelsTouchesInView = NO + delegate 区分区域

  • 单击和双击冲突 → requireGestureRecognizerToFail

  • ScrollView 与 Tap 冲突 → delaysTouchesBegan/Ended

  • 按钮点击失效 → shouldReceiveTouch 判断 UIButton 跳过

  • 复杂容器控件 → 重写 hitTest

http://www.dtcms.com/a/343205.html

相关文章:

  • 一本通1342:【例4-1】最短路径问题
  • 【Docker基础】Docker-Compose核心配置文件深度解析:从YAML语法到高级配置
  • 一个状态机如何启动/停止另一个状态机
  • C++ 常见的排序算法详解
  • CPP学习之priority_queue的使用及模拟实现
  • 3维模型导入到3Dmax中的修改色彩简单用法----第二讲
  • Kotlin 中适用集合数据的高阶函数(forEach、map、filter、groudBy、fold、sortedBy)
  • AI客服系统架构与实现:大模型、知识库与多轮对话的最佳实践
  • 蛋白质分析常用数据库2
  • QT开发---QT布局与QSS样式设置
  • 网络打印机自动化部署脚本
  • 工业机器人远程监控与运维物联网解决方案
  • 精准评估新纪元:AI得贤招聘官AI面试智能体6.3,重新定义AI面试
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记与代码示例:Quad-SPl Flash 闪存控制器
  • 深度剖析字节跳动VeOmni框架
  • MySQL索引优化之索引条件字段类型不同
  • POI读和写
  • C2ComponentStore
  • CMOS知识点 MOS管线性区电流公式
  • Linux 网络命令大全
  • 在VSCode中配置.NET项目的tasks.json以实现清理、构建、热重载和发布等操作
  • vue2 watch 用法
  • K8s安全管理与持久化存储实战指南
  • Seaborn数据可视化实战:Seaborn入门-环境搭建与基础操作
  • Seaborn数据可视化实战
  • AI对口型唱演:科技赋能,开启虚拟歌者新篇章
  • 刷机维修进阶教程-----如何清除云账号 修复wifi 指南针 相机 指纹等刷机故障
  • 自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec
  • Linux 802.11协议栈深度分析与实践指南
  • 车机两分屏运行Unity制作的效果