说UI事件之前我们先看一下UIView&CALayer
关系联系
UIView 中属性lyaer其实就是CALayer类型的,backgroundColor是对CALayer同名属性的包装,UIView的显示部分是由CALayer的contents来决定的,它对应backing store(其实是bitmap类型的位图),最终我们显示到屏幕上的UI空间可以理解成位图
区别
UIView 为CALayer提供显示的内容,以及负责处理触摸等事件,参与视图的事件响应链
CALayer 负责显示内容contents
事件传递&事件响应链
b1例如 上图(b1) 试图点击视图c2,系统如何找到事件响应的视图,事件传递离不开两个方法
//响应试图的view
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
//判断点击位置是否在当前试图内,在就返回yes
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
事件传递流程
流程图从流程图中可以看到,UIWindow会调用hitTest方法,系统hitTest方法中会去调用pointInside方法来判断点击是否在当前试图中,如果返回YES遍历当前试图,这里是从后往前遍历(即倒序遍历)他的子试图,子试图会去调用hitTest方法(如果子试图还有子试图,会去遍孙子视图,孙子视图会去hitTest方法)找到响应试图并结束流程,如果都没有找到返回当前视图Window
hitTest:withEvent:内部实现
网友评论