码迷,mamicode.com
首页 > 其他好文 > 详细

响应者链

时间:2015-08-12 16:42:41      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

在上面的图片中,如果touch点击的时候,是点击在view E里面。则检测过程是

1.首先是touch点在view A的bounds中,接下来检测view B和view C.

2.检测到touch点不在view B,在view C中,接下来检测view D和view E.

3.检测到touch点不在view D中,在view E中。

此时hit-testing过程已经完成,view E就是hit-test View.

 

检测到hit-test View后,此view拥有优先处理事件的权利,如果view不能处理这个事件,事件就会沿着响应者链向下传递,直到找到一个能处理该事件的view.

 

在开发中我们,可能会用到下面这2个函数

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

 

这个是用来当前在view 中的view是否包含指定的点。

这个函数一般情况下很少直接调用,一般都是重写这个方法来处理视图中子视图的touch事件。如果你重写了这个函数,那么就要注意了,你设置view的user interactions,hidden,alpha,对于他是不起作用的,就是不管你怎么设置,这个函数都会一直进入。所以这是个蛋疼的地方,使用的时候要切记这个,不然你会有惊喜的。

 

另外你添加了子视图,但是clipsToBounds是NO的情况下,当你点击子视图超出view的部分,是不会响应的,点击区域只有在view的bounds中才会响应的。这也是要注意的。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

这个函数返回bool值,来反映当前point是否在view中。通常都是在上面- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event的函数调用此方法。

 

上面2个函数一般情况下,使用的不多,除非是特殊情况下(变态的需求)才会使用。

 

下面来看下响应链的具体传递

技术分享

可以看出,传递的方向就是从最上面的view向下传递,如果view是view controller的view,还会经过view controller之后在向下传递,最终到达app对象。

 

响应者链

标签:

原文地址:http://www.cnblogs.com/fengkuangIT/p/4724644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!