touch事件分发

IOS事件分发函数

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

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

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

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

 

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

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

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

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

先看第一种: event

当事件传递到该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 后,马上经过响应链进行反传

 

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

但愿大牛们  指导。。指导啊 !!!!

相关文章
相关标签/搜索