事件传递&视图响应的机制和流程
2018-12-17 本文已影响0人
滨滨_57b5
UIView和CALayer
- UIView中有一个CALayer类型的属性layer和backgroundColor等,background等属性实际是对CALayer类型下同名属性的包装;
- UIView的显示部分是由CALayer的contents属性决定的,contents对应的backing store(bit map类型的位图),最终显示到屏幕上的控件,实际就是位图
- UIView为CAlayer提供内容,以及负责处理触摸事件,参与响应链
- CALayer只负责显示内容contents
问题:为什么显示视图要使用UIView和CALayer俩个类型,为什么不直接使用一个类型?
体现了系统的一个设计原则,即单一职责原则
事件传递机制
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event;//最终哪个视图响应了事件
- (BOOL)pointInside:(CGPoint)point withEvent(UIEvent*)event;//用来判断点击位置是否在当前视图范围内
事件响应链
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- 子视图有重叠现象时:找到最适合的响应视图后事件会从此视图开始沿着响应链nextResponder传递,直到找到处理事件的视图,如果没有处理的事件会被丢弃。
- 子视图没有重叠现象时: 事件的响应不是通过nextResponder向上传递的,而是通过事件的传递机制找到最终响应的那个视图的,从而执行相应touches方法的
- 如果视图有父视图则nextResponder指向父视图,如果是根视图则指向控制器,最终指向AppDelegate, 他们都是通过重写nextResponder来实现。
知识点:UIApplication相关(包括什么是UIApplication事件队列等)
知识点:loadview方法相关
知识点:UIResponder相关
知识点:UIEvent底层
知识点:加速度器、陀螺仪、磁力仪相关的运动事件不遵循此响应链,他们是由Core Motion 直接派发的