UI事件传递&响应

UIView与CALayer的关系与区别

UIView为CALayer提供内容,以及负责触摸等事件,参与响应链
CALayer负责显示内容contents

UI事件传递&响应_第1张图片
image.png

视图事件传递

系统是如何找到最终响应的视图是C2?

UI事件传递&响应_第2张图片
事件传递流程图

图中的hitTest:withEvent其实是一个递归调用,UIWindow调用这个方法,这个方法会遍历所有的子View,子View又会调用自己的hitTest:withEvent方法,最终找到响应的view返回,如果没有找到,则由window响应。
倒序遍历:就是后添加的view先遍历。

//最终哪个视图响应这个事件,就返回哪个视图
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
//用于判断点击的位置是否在当前视图内
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

事件传递相关的两个方法,在hitTest:withEvent方法中会调用pointInside:withEvent方法。

UI事件传递&响应_第3张图片
hitTest:withEvent系统处理流程

视图响应链

UI事件传递&响应_第4张图片
官网给出的事件响应链

如最开始的那幅图所示,点击了C2,事件响应传递顺序为:C2->B2->A->...->UIApplicationDelegate
如果最终传递到了UIApplicationDelegate还是没人去处理这个事件,那么就会忽略这个事件。

你可能感兴趣的:(UI事件传递&响应)