zoukankan      html  css  js  c++  java
  • iOS中的事件传递和响应者链

    首先我们来看看iOS中事件的产生和传递过程:

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

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

    3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件

    4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin... touchesMoved...touchesEnded等

    5.这些touches方法默认的做法是将事件顺着响应者链条向上传递,将事件叫个上一个相应者进行处理

    下面我们举个例子来演示下具体的传递过程,如图:

    一般事件的传递是从父控件传递到子控件的

    例如:点击了绿色的View,传递过程如下:UIApplication->Window->白色View->绿色View

    点击蓝色的View,传递过程如下:UIApplication->Window->白色View->橙色View->蓝色View

    如果父控件接受不到触摸事件,那么子控件就不可能接收到触摸事件

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

    1.不接受用户交互:userInteractionEnabled = NO;

    2.隐藏:hidden = YES;

    3.透明:alpha = 0.0~0.01

    如何找到最合适的控件来处理事件呢?有以下准则

    1.自己是否能接受触摸事件

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

    3.从后往前遍历子控件,重复上面的两个步骤

    4.如果没有符合条件的子控件,那么自己最适合处理

    例如:

    说明一下控件的添加顺序:白1->绿2->橙2->蓝3->红3->黄4

    这里点击了橙色的那块区域,事件传递判断过程如下:

    1.UIApplication从事件队列中取出事件分发给UIWindow

    2.UIWindow判断自己是否能接受触摸事件,可以

    3.UIWindow判断触摸点是否在自己身上,是的。

    4.UIWindow从后往前便利自己的子控件,取出白1

    5.白1都满足最上面两个条件,遍历子控件橙2

    6.橙2都满足最上面两个条件,遍历子控件,先取出红3

    7.红3不满足条件2,取出蓝3

    8.蓝3也不满足条件2,最后最合适的控件是橙2

    找到合适的控件之后就要进行响应了,这里先介绍一下响应者链条:响应者链条其实就是很多响应者对象(继承自UIResponder的对象)一起组合起来的链条称之为响应者链条

    一般默认做法是控件将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理。那么如何判断当前响应者的上一个响应者是谁呢?有以下两个规则:

    1.判断当前是否是控制器的View,如果是控制器的View,上一个响应者就是控制器

    2.如果不是控制器的View,上一个响应者就是父控件

    响应过程如下图:

    如果控制器也不响应响应touches方法,就交给UIWindow。如果UIWindow也不响应,交给UIApplication,如果都不响应事件就作废了。

    最后总结来说一次完整的触摸事件的传递响应过程为:

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

     
    PS:利用响应者链条我们可以通过调用touches的super 方法,让多个响应者同时响应该事件。
    感谢您的访问! 若对您有帮助或有兴趣请关注博客:http://www.cnblogs.com/Rong-Shengcom/
  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/Rong-Shengcom/p/5202097.html
Copyright © 2011-2022 走看看