iOS事件响应原理
从触摸到业务回调的路径
iOS 中一次点击并不是直接调用按钮回调,而是经历:
- 事件产生(系统采集触摸)
- 事件分发(UIApplication -> UIWindow)
- 命中测试(hit-test 找到目标 view)
- 响应链传递(Responder Chain)
理解这个链路后,事件冲突、点击失效、手势互斥都能按路径排查。
命中测试规则
hitTest:withEvent: 会先判断当前 view 是否可交互,再从子视图逆序遍历,优先返回视觉上层的可点击视图。
常见导致点击无效的原因:
userInteractionEnabled = NOalpha太低或hidden = YES- 父视图裁剪/遮挡
响应链的作用
当当前对象不处理事件,事件会沿响应链向上(view -> viewController -> window -> app)传递。
这让你可以在上层统一处理键盘事件、手势冲突、快捷键等。
与手势识别的关系
手势识别器会在分发阶段参与竞争。若未正确配置代理,常出现“手势抢走点击”或“didSelect 不触发”的问题。
排查步骤
- 确认 view 可交互属性。
- 打印
hitTest目标是否符合预期。 - 检查手势代理和
cancelsTouchesInView。 - 必要时抓取事件链日志。
总结
事件系统不是黑盒。按“分发 -> 命中 -> 传递 -> 手势竞争”四步定位,绝大多数交互问题都可快速收敛。