• 响应者链条,iOS中touchs事件的处理流程。


    用户在使用app的时候,会产生各样的事件。在iOS中的事件可以分为三种

    1. 触摸事件(Touch Event)
    2. 加速计事件(Accelerometer Event)
    3. 远程控制事件(Remote Control event)

    在iOS中,并不是所有的对象都能处理事件,直接或者间接继承UIResponder的对象(UIApplication、 UIViewController、UIWindow和所有继承自UIView的UIKit类)才能对事件进行响应,我们称呼这些为“响应者对象”;

    在UIRecponder中提供了下面的代码来处理事件:

     1 //触摸事件
     2 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
     3 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
     4 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
     5 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
     6 //加速计事件
     7 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
     8 - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
     9 - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
    10 
    11//远程控制事件
    12 - (void)remoteControlReceivedWithEvent:(UIEvent *)event;

    那我们就可以用触摸事件处理的过程来说一下响应者链条和响应者对象,在刚才我们说了能对事件进行响应的叫做响应者对象,响应者对象能够响应、处理事件。而响应者链条是由多个响应者对象构成的一个具有层级关系的东西。

    比如下图:

    上图中的view,controller,window,application都是响应者对象,按照箭头的走向不难看出响应者链条的关系:

    1. 响应者链条是由响应者对象组成(view,controller,window,application。。。)
    2. 一个响应者的下一个响应者是他的父控件,或者是他所在的控制器

    响应者链条可以让多个响应者同时响应一个触摸事件;

    我在颜色View.m的文件中写了

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

        NSLog(@"颜色View被摸了" );

    的代码,当一个view被点击,它是响应者链的开端。整个响应者链和事件分发的使命都是找出第一响应者。这个第一响应者是最适合做出响应事件的对象,整个响应过程是这样子的:

     UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件-->控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者

    1. 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图

    2. 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理

    3. 如果window对象也不处理,则其将事件或消息传递给UIApplication对象

    4. 如果UIApplication也不能处理该事件或消息,则将其丢弃 

    当我在greenViewa.m中touchesBegan的方法中添加代码

    [super touchesBegan:touches withEvent:event];

    在图片中可以看出greenView是Yellow的子视图,也就是说greenview的下一个响应者时yellow,而greenview.m中调用了super,那么就是说yellow也可以响应touchesBegan的方法,

    这样的话运行结果就是:

    2015-11-07 00:35:01.748 ResponderChain[4984:95390] yellowView被摸了

    2015-11-07 00:35:01.748 ResponderChain[4984:95390] greenView被摸了

     

    这样就实现了多个响应者对象响应一个事件。我们可以用这个作出有意思的东西。

     

    参考文献:

    https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html#//apple_ref/doc/uid/TP40009541-CH4-SW1

  • 相关阅读:
    大数据实践解析(上):聊一聊spark的文件组织方式
    npm 项目更换目录后无法启动
    Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
    Vue 爬坑之路(五)—— 组件进阶
    Vue 爬坑之路(四)—— 与 Vuex 的第一次接触
    Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
    Vue 爬坑之路(二)—— 组件之间的数据传递
    Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
    同步类的基础AbstractQueuedSynchronizer(AQS)
    由于不当的执行顺序导致的死锁
  • 原文地址:https://www.cnblogs.com/suqiankun/p/4944042.html
Copyright © 2020-2023  润新知