UIView与CALayer的关系与区别
UIView为CALayer提供内容,以及负责触摸等事件,参与响应链
CALayer负责显示内容contents
视图事件传递
系统是如何找到最终响应的视图是C2?
图中的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方法。
视图响应链
如最开始的那幅图所示,点击了C2,事件响应传递顺序为:C2->B2->A->...->UIApplicationDelegate
如果最终传递到了UIApplicationDelegate还是没人去处理这个事件,那么就会忽略这个事件。