响应者链的事件分发:从Window的视图开始分发向上传(向内部传),一定要分清楚谁是谁的子视图以及同级视图中他们的先后顺序,具体流程请看代码
//分发事件的方法
/*
0.判断该点是否在视图内,如果不是返回nil
1.遍历子视图(倒序)
2.转换坐标系
3.分发给子视图
4.查看触摸点在不在子视图中 在的话子视图调用hitTest,如果有返回值,直接返回,循环结束,方法结束
5.如果没有,返回self
*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
NSLog(@"-----a");
// 0.判断点 是否在本身的bounds内
BOOL inside = [self pointInside:point withEvent:event];
if (!inside) {
return nil;
}
//1.遍历子视图
for (int i =(int)self.subviews.count-1;i>=0; i--) {
//获取subView
UIView *subView = [self.subviews objectAtIndex:i];
//converPoint toView转换到子视图的坐标系
CGPoint p = [self convertPoint:point toView:subView];
//判断子视图的hitTest方法有没有返回值,如果没有返回值,继续循环
UIView *view = [subView hitTest:p withEvent:event];
if ([subView pointInside:p withEvent:event]) {
if (view) {
return view;
}
}
}
//5.r如果没有子视图,返回self
return self;
}