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

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

 

  • 触摸点在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不能处理事件,该事件将从事件响应链中寻找响应器,直到系统找到一个处理事件的对象。若不能处理,则就有事件传递链了,继续看下面的事件传递链。

事件传递链如下图所示:

 

左半图:

  • 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单例对象也不能处理,则表示无效事件

若要了解更多,参考官方文档吧:Event Handling Guide for iOS