UIResponder是OC中一个响应事件的类。UIApplication、UIView、UIViewController都是它的子类。UIWindow是UIView的子类,因此也能响应事件。
UIResponder能够响应的事件有三种:Touch Events(触摸事件)、Motion Events(运动事件)、Remote Control Events(远程控制事件)。
本文主要介绍触摸事件。
触摸事件发生时,UIKit会创建一个UIEvent对象,并把它放入一个先进先出的事件队列中。当处理事件时,UIApplication对象会从队列头部取出一个事件对象进行分发。通常来说,UIApplication会把事件传递给key window对象,window会把事件传递给触摸事件发生的那个视图。这一视图被称为hit-test view,而寻找hit-test view的过程叫做hit-testing。
hit-testing很简单:它检测触摸事件是否发生在相关视图对象的边界之内。如果在,就递归检测它的所有子视图。包含触摸点且位于视图层次结构最底层的视图就是hit-test view。代码表示如下:
如果hit-test view没有响应事件,那么事件会沿着一条响应者链(Responder Chain)进行传递。响应者链以first Responder开始,以UIApplication对象结束,链上的每个对象都是响应者。
参考资料: