美文网首页
事件传递&视图响应的机制和流程

事件传递&视图响应的机制和流程

作者: 滨滨_57b5 | 来源:发表于2018-12-17 08:50 被阅读0次

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;//用来判断点击位置是否在当前视图范围内

1544671054550.jpg

事件响应链

- (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 直接派发的

相关文章

网友评论

      本文标题:事件传递&视图响应的机制和流程

      本文链接:https://www.haomeiwen.com/subject/qifehqtx.html