UIResponder
只有继承了UIResponder的类才能接受并处理事件
1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中
2.UIApplication会从事件队列中取出最前面的,发送给主窗口 keyWindow
3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
命中测试
如何找到最合适的view,ios使用命中测试去寻找触摸发生下的view。命中测试会判断该触摸点发生在某个具体的view的相对边界之内。如果检测是,就递归检测该view的所有子view。直到层级最低端view包含触摸点,它就成了”命中测试view“
hitTest:withEvent 传入CGPoint和UIEvent返回命中测试view。其内部调用pointInside:withEvent判断触摸点是否在view上
命中测试view被赋予第一个处理触摸事件的机会,如果命中测试view不能处理该事件,该事件就会交付给view响应链的上一级处理知道系统找到一个能处理该事件的对象。
UIView不能接受触摸事件的三种情况
- userInteractionEnabled = NO
- 隐藏
- 透明度