iOS使用hit-testing,事件响应者链的工作原理

iOS使用hit-testing寻找触摸的view。 Hit-Testing通过检查触摸点是否在关联的view边界内,如果在,则递归地检查该view的所有子view。在层级上处于lowest(就是离用户最近的view)且边界范围包含触摸点的view成为hit-test view。确定hit-test view后,它传递触摸事件给该view。

官方小例子事件响应者链如下图所示:

iOS使用hit-testing,事件响应者链的工作原理_第1张图片
386B3F93-2F8B-4848-956C-0152E797B5F1.png
  • 触摸点在view A中,所以要先检查子view B和C。
  • 触摸点不在view B中,但在C中,所以检查C的子view D和E。
  • 触摸点不在D中,但在E中。View E是这个层级上处于lowest的- view的边界范围包含触摸点,所以它成为了hit-test view。
    Hit-test view是处理触摸事件的第一选择,如果hit-test view不能处理事件,该事件将从事件响应链中寻找响应器,直到系统找到一个处理事件的对象。若不能处理,则就有事件传递链了,继续看下面的事件传递链。

事件传递链如下图所示:

iOS使用hit-testing,事件响应者链的工作原理_第2张图片
iOS_responder_chain.png
左半图:

initial view若不能处理事件,则传到其父视图view
view若不能处理,则传到其父视图,因为它还不是最上层视图
这里view的父视图是view controller的view,因为这个view也不能处理事件,因此传给view controller
若view controller也不能处理此事件,则传到window
若window也不能处理此事件,则传到app单例对象Application
若UIApplication单例对象也不能处理,则表示无效事件
右半图:

initial view一直传递直到最上层view(原话:A view passes an event up its view controller’s view hierarchy until it reaches the topmost view.)
topmost view传递事件到它所在的控制器(原话:The topmost view passes the event to its view controller.)
view controller传递事件到topmost view的父视图,重复前三步,走到到达root controller(原话:passes the event to its topmost view’s superview. Steps 1-3 repeat until the event reaches the root view controller.)
由root控制器传递事件到window(原话:The root view controller passes the event to the window object.)
若window也不能处理此事件,则传到app单例对象Application
若UIApplication单例对象也不能处理,则表示无效事件

hit-testing还有两点点个人感觉比较关键的点。
一、首先这个View它会检查自己是否能够接收触摸事件(有三点不能接收触摸事件:1、透明度<0.1,2、hidden=YES的时候,3、userInteractionEnabled = NO),然后它才会判断当前点在不在自己身上
二、当它遍历子控件的时候,是倒序遍历的

你可能感兴趣的:(iOS使用hit-testing,事件响应者链的工作原理)