一、事件是如何被视图接收到的?
当我们触摸屏幕的时候,系统会生成一个Event和point信息传递给当前的应用, 并通过以下两个方法传递并找到合适的响应者
//返回接收响应事件的视图
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
//判断触摸点是否在视图内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
2、那么事件是从哪里开始传递的呢?
- 如下图.点击屏幕,传给当前的application的window对象.
- window本身就是一个UIView,从window开始《递归+倒序遍历》它的子试图.
- 每个被遍历到的试图,通过hittest和pointInSide方法判断自身或其子试图是否符合条件.
- 如果找到就返回对应的视图去处理触摸事件,找不到就忽略.
截屏2021-11-18 下午7.05.23.png
三、hittest细节
截屏2021-11-18 下午7.07.37.png