原理大概这样子
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"%@,%s",self.class,__func__);
//自身不能接受触摸,返回空
//对于继承自UIControl的控件,还需要判断enable的值
if (!self.userInteractionEnabled || self.hidden || self.alpha < 0.01 ) {
return nil;
}
//触摸点不在自身区域内,返回空,不再遍历子视图
if (![self pointInside:point withEvent:event]) {
return nil;
}
//从后往前遍历子视图
NSArray *subView = self.subviews;
__block UIView * view = nil;
[subView enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(UIView * obj, NSUInteger idx, BOOL * _Nonnull stop) {
CGPoint subPoint = [self convertPoint:point toView:obj];
view = [obj hitTest:subPoint withEvent:event];
if (view) {
*stop = YES;
}
}];
//找到合适的子视图
if (view) {
return view;
}
//没有找到合适的子视图,返回本身
return self;
// return [super hitTest:point withEvent:event];
}