事件响应链

作者: 伊蕊飘零 | 来源:发表于2016-07-16 00:09 被阅读79次

    事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播. 可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。
    1> 首先解释响应者链的概念
    UIResponder类,是UIKIT中一个用于处理事件响应的基类。窗口上的所有事件触发,都由该类响应(即事件处理入口)。所以,窗口上的 View及控制器都是派生于该类的,例如UIView、UIViewController等。调用UIResponder类提供的方法或属性,我们就可以捕捉到窗口上的所有响应事件,并进行处理。
    响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事件的对象,所有的View和ViewController都是响应者对象,利用响应者链条能让多个控件处理同一个触摸事件.

    主循环 捕获 了用户的点击事件 : 它要做事件分发 --> 找到最适合处理这个事件的view寻找的链条: 首先找UIApplication --> UIWindow --> RootViewController --> View 到view这个层级的时候 会遍历他所有的子view (按照 倒序去遍历 --> 从最后添加的子view开始) 通过下面两个方法来进行查找

    // 返回最适合处理事件的view
         - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
      内部会自动调用 pointInside 这个方法, 做判断
                                          return [super hitTest:point withEvent:event];
    
    }
     // 检测 点击的位置是否在 这个view上
                  - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
                         return [super pointInside:point withEvent:event];
    }
    

    找到最合适处理该事件view之后, 就会查找 处理事件的方法

    2>事件传递机制
    如果当前view不能处理当前事件,那么事件将会沿着响应者链(Responder Chain)进行传递,知道遇到能处理该事件的响应者(Responsder Object)。

    1. 接收事件的initial view如果不能处理该事件并且她不是顶层的View,则事件会往它的父View进行传递。
      2).initial view的父View获取事件后如果仍不能处理,则继续往上传递,循环这个过程。如果顶层的View还是不能处理这个事件的话,则会将事件传递给它们的ViewController,
      3). 如果ViewController也不能处理,则传递给Window(UIWindow),此时Window不能处理的话就将事件传递UIApplication,最后如果连Application也不能处理,则废弃该事件

    相关文章

      网友评论

        本文标题:事件响应链

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