iOS事件响应原理

从触摸到业务回调的路径

iOS 中一次点击并不是直接调用按钮回调,而是经历:

  1. 事件产生(系统采集触摸)
  2. 事件分发(UIApplication -> UIWindow)
  3. 命中测试(hit-test 找到目标 view)
  4. 响应链传递(Responder Chain)

理解这个链路后,事件冲突、点击失效、手势互斥都能按路径排查。

命中测试规则

hitTest:withEvent: 会先判断当前 view 是否可交互,再从子视图逆序遍历,优先返回视觉上层的可点击视图。

常见导致点击无效的原因:

  • userInteractionEnabled = NO
  • alpha 太低或 hidden = YES
  • 父视图裁剪/遮挡

响应链的作用

当当前对象不处理事件,事件会沿响应链向上(view -> viewController -> window -> app)传递。

这让你可以在上层统一处理键盘事件、手势冲突、快捷键等。

与手势识别的关系

手势识别器会在分发阶段参与竞争。若未正确配置代理,常出现“手势抢走点击”或“didSelect 不触发”的问题。

排查步骤

  1. 确认 view 可交互属性。
  2. 打印 hitTest 目标是否符合预期。
  3. 检查手势代理和 cancelsTouchesInView
  4. 必要时抓取事件链日志。

总结

事件系统不是黑盒。按“分发 -> 命中 -> 传递 -> 手势竞争”四步定位,绝大多数交互问题都可快速收敛。

results matching ""

    No results matching ""

    results matching ""

      No results matching ""