美文网首页
iOS 事件传递机制

iOS 事件传递机制

作者: Jt_Self | 来源:发表于2018-07-23 11:47 被阅读0次

事件传递机制

  1. 响应者链的事件传递过程:

    1. 如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图。
    2. 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理。
    3. 如果window对象也不处理,则其将事件或消息传递给UIApplication对象。
    4. 如果UIApplication也不能处理该事件或消息,则将其丢弃。
  2. 事件处理的整个流程总结:

    1. 触摸屏幕产生触摸事件后,触摸事件会被添加到由UIApplication管理的事件队列中(即,首先接收到事件的是UIApplication)。
    2. UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序的主窗口(keyWindow)。
    3. 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。(至此,第一步已完成)
    4. 最合适的view会调用自己的touches方法处理事件
    5. touches默认做法是把事件顺着响应者链条向上抛。
  3. 事件的传递与响应:

    1. 当一个事件发生后,事件会从父控件传给子控件,也就是说由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的传递,也就是寻找最合适的view的过程。
    2. 接下来是事件的响应。首先看initial view能否处理这个事件,如果不能则会将事件传递给其上级视图(inital view的superView);如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃。
    3. 在事件的响应中,如果某个控件实现了touches...方法,则这个事件将由该控件来接受,如果调用了[supertouches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法。
PS:事件的传递和响应的区别:

事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件)。

PPS:如何做到一个事件多个对象处理:

因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // 1.自己先处理事件... 
    NSLog(@"do somthing..."); 
    // 2.再调用系统的默认做法,再把事件交给上一个响应者处理 
    [super touchesBegan:touches withEvent:event]; 
}

应用如何找到最合适的控件来处理事件?

  1. 首先判断主窗口(keyWindow)自己是否能接受触摸事件

  2. 判断触摸点是否在自己身上

  3. 子控件数组中从后往前遍历子控件,重复前面的两个步骤(所谓从后往前遍历子控件,就是首先查找子控件数组中最后一个元素,然后执行1、2步骤)

  4. view,比如叫做fitView,那么会把这个事件交给这个fitView,再遍历这个fitView的子控件,直至没有更合适的view为止。

  5. 如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。

寻找最合适控件的底层实现

  1. 注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行转化,将父视图上的坐标点转换到所要传递的子视图上的坐标点

  2. hitTest的底层实现:当控件接收到触摸事件的时候,不管能不能处理事件,都会调用hitTest方法,此方法的底层实现是:1:先看自己是否能接受触摸事件 2:再看触摸点是否在自己身上 3:从后往前遍历子控件,拿到子控件后,再次重复1,2步骤,要把父控件上的坐标点转换为子控件坐标系下的点,再次执行hitTest方法。

  3. 若是最后还没有找到合适的view,那么就return self,自己就是合适的view

参考文章: https://www.jianshu.com/p/2e074db792ba

相关文章

  • 深入浅出iOS事件机制

    深入浅出iOS事件机制事件传递:响应链事件传递响应链

  • 初识iOS事情处理机制

    参考:史上最详细的iOS之事件的传递和响应机制-原理篇iOS触摸事件全家桶史上最详细的iOS之事件的传递和响应机制...

  • iOS之事件的传递和响应机制

    iOS之事件的传递和响应机制

  • 01进阶之路-UI视图

    1. 事件传递机制和响应者链条 学习链接 事件传递机制iOS中的事件可以分为3大类型 1 触摸事件 2 加速计...

  • iOS事件传递和视图响应

    iOS事件响应机制的事件传递流程 - (UIView *)hitTest:(CGPoint)point withE...

  • iOS 事件传递机制

    事件传递机制 响应者链的事件传递过程:如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给...

  • iOS事件传递机制

    发生触摸事件后,系统会将事件加入到一个由UIApplication管理的事件队列中(事件处理遵循FIFO) 一个事...

  • iOS 事件传递机制

    iOS的事件分为以下几种 Touch Events 触摸事件 Shake-motion events 运动事件,比...

  • IOS 事件传递机制

    事件传递流程 倒序查找子视图 也就是说最后添加的视图会最先查找 同时也会调用子视图内的 hitText 方法返回最...

  • iOS事件传递机制

    本文来自:风雨「83」[https://blog.csdn.net/wywinstonwy/article/det...

网友评论

      本文标题:iOS 事件传递机制

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