iOS事件传递机制

https://juejin.im/post/5d396ef7518825453b605afa

 

我的理解:

第一步:
hit-testing找到:hit-test view/window,保存在哪里呢?
找到响应者链/响应者链中的view链,保存在哪里呢?
第二步:
第一个touch:
(1)touch 初始化,沿着链条找哪些要响应 event?(不知道保存在哪里)
(2)沿着链条找哪些要响应 touch,保存在 touch 的 gestures 中
手指移动:
(3)遍历 touch 中 gestures, 调用 touchMoved
手指抬起:
(4)遍历 touch 中 gestures, 调用 touchEnd
(5)在响应 touch 的过程中,有些 touch 中保存的 gesture 有些会被移除掉
(6)touch 和 有可能的 gestures 被保存在 手势环境中
第三步:
第二个touch:
。。。。
手势被识别

demo1:
单击事件:
----- 手指点下 -----
// 探测阶段
(1)hit-testing
// 手势处理阶段
(2)手势代理:是否接收 event (调用顺序按照视图层级)
(3)手势代理:是否接收 touch
(4)接收的话,调用手势的 touchBegan
// view 处理阶段
(5)调用 view 的 touchBegan
----- 手指放开 -----
(6)手势的 hit-test view 是否 begin(hit-test view 被 touch 保存吗?)
(7)手势代理:手势被识别,是否 begin,不begin就失败了
(8)调用手势的 touchEnd
(9)被识别的话,调用 view 的 touchCancel,没有被识别的话,调用 view 的 touchEnd

demo2:
双击事件
----- 手指点下 -----
// 探测阶段
(1)hit-testing
// 手势处理阶段
(2)手势代理:是否接收 event (调用顺序按照视图层级)
(3)手势代理:是否接收 touch
(4)接收的话,调用手势的 touchBegan
// view 处理阶段
(5)调用 view 的 touchBegan
----- 手指放开 -----(这里没有调用 view 的 touchEnd 耶)
(6)调用手势的 touchEnd
----- 手指点下 -----(也没有调用 view 的 touch 方法)
(7)手势代理:是否接收 touch
(8)调用手势的 touchBegan
----- 手指放开 -----
(9)手势的 hit-test view 是否 begin(hit-test view 被 touch 保存吗?)
(10)手势代理:手势被识别,是否 begin,不begin就失败了
(11)调用手势的 touchEnd
(12)调用 selector
(13)调用 view 的 touchCancel

 

疑问:

当两个手势都被触发了,并且不可同时响应时,系统是通过什么判断调用哪个selector的? 

 

posted @ 2020-06-22 17:17  小Garfield  阅读(148)  评论(0编辑  收藏  举报