1.当触摸屏幕的时候,由操作系统捕获响应的消息,并且将消息放进UIApplication管理的队列中。
2.从UIApplication中取出消息交给UIWindow,UIWindow做出以下判断:
3.直到找到最合适的yellowView,此时事件传递结束,然后反向执行响应者链条。
4.touch的默认做法:自己不处理,交给上一个响应者。上一个响应者默认是父控件。可以通过重写touch方法来处理响应的点击事件,重写的方法如果不调用父类的方法,则响应者链结束,调用则继续往下走。
- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event
1. hitText什么时候调用:当一个事件传递给一个控件的时候,控件就会调用这个方法
2. hitText作用: 寻找到最合适的view。
3. 事件传递,UIApplication -> UIWindow。UIWindow去寻找最合适的view? [UIWindow hitTest:withEvent:]里面做了什么事情?
实现思路:
1. 判断自己能不能接收事件
2. 判断点在不在自己窗口上
3. 遍历自己的子控件,找比自己更合适的View
// point:是方法调用者坐标系上的触摸点的位置
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 1.判断下能否接收触摸事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.0) return nil;
// 2.判断下点在不在控件上
if ([self pointInside:point withEvent:event] == NO) return nil;
// 3.从后往前遍历子控件
int count = (int)self.subviews.count;
for (int i = count - 1; i >= 0 ; i--) {
// 取出显示在最前面的子控件
UIView *childView = self.subviews[i];
// 转换成子控件坐标系上点
CGPoint childP = [self convertPoint:point toView:childView];
UIView *fitView = [childView hitTest:childP withEvent:event];
if (fitView) {
return fitView;
}
}
// 表示没有比自己更合适的view
return self;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/supersonico/article/details/46856311