美文网首页
iOS中的事件的产生和传递

iOS中的事件的产生和传递

作者: 赵哥窟 | 来源:发表于2018-11-02 17:46 被阅读10次
1.事件的产生

●发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,为什么是队列而不是栈?因为队列的特点是FIFO,即先进先出,先产生的事件先处理才符合常理,所以把事件添加到队列。

●UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)。

●主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步。找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理。

2.事件的传递

●触摸事件的传递是从父控件传递到子控件
●也就是UIApplication->window->寻找处理事件最合适的view
注 意: 如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件

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

1.点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理的事件队列中。
2.UIApplication会从事件对列中取出最前面的事件(触摸事件A),把事件A传递给应用程序的keyWindow。
3.判断keyWindow是否能接受触摸事件
4.判断触摸点是否在自己身上
5.子控件数组中从后往前遍历子控件,重复前面的两个步骤
6.View,比如testView,那么会把这个事件交给这个testView,再遍历这个testView的子控件,直至没有更合适的view为止。
7.如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。

2.2UIView不能接收触摸事件的三种情况

1.不允许交互:userInteractionEnabled = NO
2.隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
3.透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。
alpha:0.0~0.01为透明。

2.3如何寻找最合适的view

两个重要的方法:
hitTest:withEvent:方法
pointInside方法

2.4 hitTest:withEvent:方法什么时候调用

只要事件传递给一个控件,控件就会调用自己的hitTest:withEvent:方法

注 意:不管控件能不能处理事件,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法

2.5拦截事件的处理

●不管点击哪里,最合适的view都是hitTest:withEvent:方法中返回的那个view。
●通过重写hitTest:withEvent:,就可以拦截事件的传递过程,想让谁处理事件谁就处理事件。

注 意:如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。那么最合适的view就是该控件的父控件。

2.6 pointInside:withEvent:方法

pointInside:withEvent:方法判断点在不在当前view上。
如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件。

3.事件的响应
3.1响应者链条
image.png

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

3.2事件的传递与响应
3.2.1事件传递

当一个事件发生后,事件会从父控件传给子控件,也就是说由UIApplication -> UIWindow -> UIView -> initial view,以上就是事件的传递,也就是寻找最合适的view的过程

3.2.1事件响应

首先看initial view能否处理这个事件,如果不能则会将事件传递给其上级视图;如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃

3.2.2 事件的传递和响应的区别:

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

参考资料:
《史上最详细的iOS之事件的传递和响应机制-原理篇》

相关文章

  • iOS 事件响应链机制

    iOS中的事件的产生和传递 首先要知道 事件传递和响应过程 相反的。 事件的传递 当你点击了屏幕会产生一个触摸事件...

  • iOS中事件的产生和传递

    一.iOS中的事件可以分为3大类型 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponde...

  • iOS中的事件的产生和传递

    一.触摸事件由触屏生成后如何传递到当前应用? 系统响应 1.手指触碰屏幕,屏幕感应到触碰后,将事件交由IOKit处...

  • iOS中的事件的产生和传递

    1.事件的产生 ●发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,为什么是队...

  • iOS 中事件的产生,传递和响应

    事件 在iOS中事件UIEvent主要分为以下3大类: 触摸事件: 手指触摸屏幕,点击,滑动等 加速计事件: 主要...

  • 事件的产生和传递-iOS

    一、响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们...

  • iOS 事件的产生和传递

    事件的生命周期: 从父控件传递到子控件:UIApplication——>window——>寻找处理事件最合适的vi...

  • 事件传递和响应机制

    iOS中的事件 1.事件的生命周期 事件的生命周期从事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的...

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

    iOS中的事件 事件的生命周期 事件的生命周期从事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的vi...

  • iOS触摸事件处理详解

    iOS中事件的产生和传递 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中...

网友评论

      本文标题:iOS中的事件的产生和传递

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