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

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

作者: 滨滨_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