寻找第一响应者原理如下:
1.当用户点击屏幕时,会产生触摸事件,系统会将该事件加入到一个由UIAplication管理的事件队列中
2.UIAplication 会从实践队列中取出最前面的事件进行分发以便处理,通常,先发送给应用程序的主窗口(UIWindow)
3.UIWindow会调用hitTest:withEvent:方法在视图(UIView)层次结构中找到一个最适合的UIView来处理触摸事件(hitTest:withEvent:其实是UIView的一个方法,UIWindow继承自UIView,因此主窗口UIWindow也是输入视图的一种)
4.HItTest:withEvent:方法处理流程大致如下:
若pointInside:withEvent:方法判断触摸点是否在当前视图内:
若pointInside:withEvent:方法返回no,说明触摸点不在当前视图内,则当前视图的hitTest:withEvent:返回nil
若pointInside:withEvent:返回yes,说明触摸点在当前视图内,则遍当前视图所有子视图(subviews),调用子视图hitTest:withEvent:方法重复以上步骤,子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图的hitTest:withEvent:方法返回非空对象,获取全部子视图遍历结束:
若第一次有子视图的hitTEst:withEvent:方法返回非空对象,则当前视图的hitTest:withEvent:方法就返回此对象,处理结束
若所有子视图的hitTest:withEvent:方法都返回nil,则当前视图的hitTest:withEvent:方法返回当前视图自身(self).
找到第一响应者后,进行事件分发。