当手指触摸屏幕时, 会生成一个UIEvent
的对象从UIWindow
往子控件进行传递
首先会使用UIWindow 调用 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
方法
通过- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event
方法判断点落在自己的范围内否, 如果不在就返回nil,
如果自己能接收事件, 就遍历自己的子控件, 看是否有子控件能接收事件, 如果有就继续往下一级遍历, 如果没有, 则最终自己就是最合适的响应者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"点击了%@",[super hitTest:point withEvent:event]);
// 1.判断下自己能否接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
// 2.判断下点在不在当前控件上
if ([self pointInside:point withEvent:event] == NO) return nil; // 点不在当前控件
// 3.从后往前遍历自己的子控件
// 1 0
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;
}
}
// 4.如果没有比自己合适的子控件,最合适的view就是自己
return self;
}
网友评论