苹果事件一共分三种
1.触摸事件 2.加速计事件 3.远程控制事件
并不是所有的对象都能接受并处理事件。只有继承了UIResponder的对象才能接受处理事件,这个对象我们称为响应者对象
eg: 例如一个View随着手指拖拽移动,就可以用触摸事件来实现
获取到Touch对象,然后或去touch的当前点跟上一个点,计算出偏移量。然后修改用transform移动View。⚠️ 一般不支持多手指,如果有特殊需求,也可以self.multipleTouchEnabled = YES;
触摸事件发生后,系统会将该事件加入一个由UIApplication管理的事件对象中。
lUIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow),也就是一层层传递,父控件传递给子控件。
如果父控件不能接收触摸事件,那么子控件一定接受到触摸事件。
比如说父控件都userInteractionEnabled = no。上面添加的任何子控件都不能接收事件。
不能接收事件有三个设置(1.userInteractionEnabled = no,2,hidden = yes,3.alpha<0.01)
比如说A里面有一个B,B的view上又一个c ,现在点击c,他的touch事件由UIApplication传递到主窗口在传递到A,在到B,在到C。最后c去接收处理这个事件。 假设现在B的userInteractionEnabled = NO,那么点击c的View,哪个视图来处理事件。因为父控件不能接收触摸事件,那么子控件一定不能接收到触摸事件,所以事件传递到A就断了,B就不能接收了,所以虽然点击了C的View,但是响应事件的是A。
HitTest
hittest方法是系统调用的。什么时候调用??? 做什么的??
当一个事件传递给控件的时候系统就会去调用hitTest方法。这个方法是去寻找最适合处理事件的View。返回的UIView就是处理事件的View,把事件交给他。
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
了解事件的传递原则,那么hitText的底层实现就清楚了。每当传递事件的时候都会去调用找寻最合适的View。UIApplication-》keyWindow——》。。。。 会遍历自己的子控件,一层层判断上去第一:判断触摸点 是不是在 控件上 ,不在子控件上就不是最合适处理事件的View,返回nil。第二:判断这个View是否可以传递事件(3个不能传递的情况--》上面有说过),不能传递也不符合,返回nil。
\这种效果 怎么做 弹出一张图片 图片可以点击高亮是另一张图片,并且拖拽下面的对话框可以整体拖动。
思路:1、上面的图片可以点击有高亮状态,所以是按钮。2、拖动下面的按钮整体拖动,那么上面那个按钮(假设是A)是add到下面的按钮(B)上面的,只要没有clipTobounds就可以显示超出的部分,所以拖动A上面的是他子视图所以会一起移动。4、拖拽很简单,只要监听touchbegin。。方法就可以了,获取到touch的point和上一个point,算出他们的偏移量就可以用transform来让他跟随手指移动。5、但是由于B是添加到A上的,那么B可以点击么????
解答:触摸事件的控制链传递是一层层传的,由hitTest方法来找到最适合处理事件的view。现在点击B,系统实现HitTest方法的时候,由UIAppliction传递到A的时候就断了,因为touch的点已经不在A上面了,超出了A的frame。所以父视图都不能响应事件,那么子视图就不用去判断是否是合适的View了,肯定是不行的。那么想让B可以响应这个点击事件,那么就让A视图可以响应,然后控制链在传递到B。如何实现,那么这里就要重写HitTest方法了。实现如下图。
补充:
响应者链条(复制:02-事件传递代码)
* (学了响应者链条,目的知道谁最终处理事件。)
* touch默认做法:自己不处理事件,交给上一个响应者处理touch事件。
假设三个层A>B>C,如果触摸C,然后c不处理这个事件的话(就是不调用touch方法),就会往上传递(super),实现了就不会在向上传递了,如果在touch方法中又调用了touch方法,那么继续向上传递。直到传递给UIApplication,然后销毁。
*验证touch的默认做法先恢复所有view的默认做法
*得出结论:1> touch的默认做法:自己不处理,交给上一个响应者。2>上一个响应者默认是父控件
如果控制器A的view上加载的是另一个控制器B的view,那么这个时间能否传递,这里如果保证系统的一些重要的时间的传递必须要保证B是A的子控制器,不然事件是传递不过去的。A addchildController B
网友评论