touch事件分发

IOS事件分发

我们知道,如果要一个view(就是view,不是UIControl控件)能够响应事件操作,通常的做法是给该View加上相应的手势,或者重写和touch(当然也可以是和motion相关的,但今天主要讲的是touch)相关的一些方法,如:

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

-       (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event等

当用户产生一个事件时,UIKIt会创建一个UIEvent的对象,这个对象就包含了一些相关的信息,然后它会将该UIEvent对象发送到事件队列中,对于touch事件,则这个UIEvent对象是一系列的 touch。

事件是会一直传递的,直到有对象可以捕捉它,其传递流程是:UIApplication对象从事件队列的顶部取得单个的事件对象,然后将其发送给UIWindow对象,而UIWindow对象则会一直向下传递,直到遇到能捕捉该事件的view。

某个View能不能捕捉该事件,主要看该View的下面函数的返回值,

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

这个是hit-Test机制,还有个响应链机制,不过系统有限使用hit-Test机制来进行事件分发,如果在这种情况下事件没能得到处理,则会有第二次机会,系统使用响应链机制进行处理

先看第一种:

当事件传递到该View时,首先会调用该方法,然后根据该方法的返回值来确定:

1.  return [super hitTest:point withEvent:event];   继续传递

2. return self;  自己能捕捉就捕捉,并且结束事件传递

3. return nil;  自己不捕捉,也不传递事件

对于这个函数的解释,感觉官网的文档写的也不是很清楚,在下面我会继续分析的。

先来看看事件到底是怎样被捕捉的(默认的情况下,呵呵,为什么是默认的情况下呢?别忘了 上面说的那个函数,它可是可以改变传递的哦)

先看看图:

1.如果touch事件在view A中,他会去检查view B和view C

2.如果touch事件不再view B中,而在view C中,则view C会向下去检查其子view ----D和 E

3.如果touch事件不在view D中,而在view E中,则view E是这最终的View,他将接收这个事件,如果他不能进行响应,也就是没有任何事件操作的函数存在,那该事件就会依次向上传递(具体怎么传 ,下面会讲到),但这里要注意了:如果这个view E 是个UIControl,例如Button,此时他又没有增加点击事件的话,则该事件消失掉,不会有第二次机会通过响应链反传。

官网详细写道:如果事件通过hitTest的方式没有得到响应,则会获得第二次机会,通过下面的响应链进行反传,直到该事件被捕捉

先来看一下事件的响应链:

图:

先看左边的图:

1。Initial view 企图捕捉事件或消息,如果它不能捕获该事件,则它会把事件传递给superview,因为initail view不是它所在的view层级中最顶端的view

2.superview 企图捕捉事件,如果它也不能捕获,则它会把事件传给它的superview,因为它也不是它所在view层级中最顶端的view

3.在某个controller的view层级中,topmost view(最顶端的view )企图捕捉事件,如果它也不能捕获事件,则把事件传递给 view controller

4.view controller 企图捕捉事件,如果它不能捕捉,则把事件传递给UIWindow

5.UIWindow 企图捕捉事件,如果不能捕获,则它会把事件传递给UIApplication对象

6.如果UIApplication也不捕捉事件,则该事件被抛弃

再来看右边的图,虽然路径有点不同,但所有的事件分发都遵循下面的格则:

1.某个 view把事件在它所在的view controller的view层级中向上传递,直到到达该view层级的最顶端的view

2.最顶端的view把事件传递到 view controller

3.view controller 再把事件传递给它的topmost view (最顶端的view)的superview,,,然后重复1——3步骤,直到到达这root view controller

4.root view controller 把事件传递给UIWindow

5.UIWindow把事件传递给UIApplication

好了,最后结合hit-Test机制和响应链机制来来分析下

1. hit-Test机制   return [super hitTest:point withEvent:event];   继续传递 ------传递到最后,如果事件能被捕捉,则事件分发结束,如果不能处理该事件,则会通过响应链进行反传

2.  hit-Test   return self;  自己能捕捉就捕捉 ,并且结束事件传递 ------  事件传递到该view 后,如果该view能捕捉该事件,则自己处理,事件到此结束,如果自己不能处理,则通过响应链进行反传

3. return nil;  自己不捕捉,也不传递事件 --------事件传递到该view 后,立刻通过响应链进行反传

肚子的墨水吐的也差不多了,更高深也讲不出来了。。

希望大牛们  指导。。指导啊 !!!!

 
 
 
标签: ios, event, touch, 事件分发

touch事件分发的更多相关文章

  1. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  2. Android事件分发机制(二)30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  3. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  4. 【转】Android:Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  5. Touch事件分发机制

    原文:http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  6. Android Touch事件分发过程

    虽然网络上已经有非常多关于这个话题的优秀文章了,但还是写了这篇文章,主要还是为了加强自己的记忆吧,自己过一遍总比看别人的分析要深刻得多.那就走起吧. 简单演示样例 先看一个演示样例 : 布局文件 : ...

  7. Android Touch事件分发机制

    参考:http://blog.csdn.net/xiaanming/article/details/21696315 参考:http://blog.csdn.net/wangjinyu501/arti ...

  8. Android的Touch事件分发机制简单探析

    前言 Android中关于触摸事件的分发传递是一个很值得研究的东西.曾不见你引入了一个ListView的滑动功能,ListView就不听你手指的指唤来滚动了:也不知道为啥Button设置了onClic ...

  9. Activity Window View WindowManager关系&Touch事件分发机制

    http://www.cnblogs.com/linjzong/p/4191891.html https://www.cnblogs.com/kest/p/5141817.html https://b ...

随机推荐

  1. MongoDB详解学习历程

    MongoDB是一个基于分布式文件存储的数据库,它是介于关系数据库和非关系数据库之间的产品. MongoDB支持的数据结构非常松散,类似json的bjson格式,因此可以存储比较复杂的数据类型.Mon ...

  2. 【百度地图API】如何制作公交线路的搜索?如331路

    原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...

  3. 健身小管家--android app源码

    把做了近一个月的android程序源码放出来,里面包括但不限于如下内容: 1. 简单的android项目结构 2. 通用的adapter,不再为每一个ListView都写一个adapter,只要用此一 ...

  4. MySQL引擎的相关知识

    MySQL数 据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引 擎:ISAM.MYISAM和HEAP.另外两种类型I ...

  5. oracle中的DECODE

    原文:oracle中的DECODE   DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶 ...

  6. Apache无法启动解决 the requested operation has failed

    Apache不能启动解决办法 原因一:80端口占用例如IIS,另外就是迅雷. 原因二:软件冲突装了某些软件会使apache无法启动如Dr.com 你打开网络连接->TcpIp属性->高级- ...

  7. 面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式

    什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下 ...

  8. C#中float的取值范围和精度

    原文:C#中float的取值范围和精度 float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double. 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例中所示: floa ...

  9. 用批处理文件自动备份文件及文件夹,并自动删除n天前的文件

    原文:用批处理文件自动备份文件及文件夹,并自动删除n天前的文件 ---恢复内容开始--- 下是备份的批处理,添加到"计划任务"中,设定时间自动运行 复制代码 代码如下:@echo ...

  10. 读书笔记—CLR via C#委托和attribute

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...