事件处理机制总结

来源:互联网 发布:app编程工具 编辑:程序博客网 时间:2024/06/05 20:28

本文总结一下事件传递机制和事件响应链的机制。

UIResponder是所有能够响应事件的类的基类,凡是从该类派生的类都可以响应事件。包括UIApplication,UIWindow,UIView(UIView的子类,各种UI控件),UIViewController等。

UITouch,UIEvent,UIGestureRecognizer,UIView,UIResponder之间的关系:

UITouch指一个触控动作。

多个UITouch或键盘操作构成一个UIEvent。

UIGestureRecognizer可以从多个UIEvent中识别出特定手势,实现对手势的响应。

UIResponder类中的方法支持对单个手势的响应。


当触控事件发生时,设置了Gesture Recognizers的View会先通过识别器去拦截触控事件,如果该触控事件是事先为View设定的触控监听事件,那么Gesture Recognizers将会发送动作消息给目标处理对象,目标处理对象则对这次触控事件进行处理。

在由UITouch产生开始识别UIEvent时,会有不同的识别状态:Possible-Began-Changed-Recognized。对应不同的状态,

UIResponder对应有相应的方法可以重载:

  • touchesBegan:withEvent:
  • touchesMoved:withEvent:
  • touchesEnded:withEvent:
  • touchesCancelled:withEvent:

    当事件产生后,UIKit会产生一个事件对象放至应用的响应queue中。应用从相应队列取出事件后,然后传递至一个初始对象。

    初始对象根据事件不同而不同。

    touch event的初始对象为Hit-TestView

    Motion and remote control events的初始对象为First Responder。

    responder chain的机制如下:


    在讲解GestureRecgnizer的机制时,提到如下的常规时间传递过程,但是此过程与上述过程是有矛盾的,主要是window得到事件的顺序冲突。经过代码测试,tap和swipe的Gesture,view是在window之前拦截到事件并处理的。 因此下面的流程图特指view上的Gesture优先于view本身先得到事件处理机会,其它流程是不正确的。


    比如父UIView的Gesture和子UIView哪个先匹配,多个view的recognizer都匹配同一事件,哪个先匹配。控件对应的addTarget增加的是否是一个recognizer?

    确定后答案如下: View是优于父View的Gesture,多个view的recognizer按照级别匹配优先级,子更优先。同级别情况下控件对应的addTarget优先级低于recognizer。

    总原则如下(优先级从先至后):子优先于父,gesturerecognizer优先于控件的addTarget。事件被处理了就不会继续传递了(也就是只匹配gesture或addTarget其中一个),但是每个gesture或addTarget可以对应多个选择器,多个选择器都会被执行。

    UIResponder中的方法重载之后,优先级为UIView>UIViewController>UIApplication

  • 0 0
    原创粉丝点击