关于objc的hitTest的处理逻辑:当用户点击界面时,事件交给
UIApplication
一层层传递到控件上 ,确认最后一层后,就调用touchesBegan
相关事件一层层回传,如果未被拦截,最终传到UIApplication
/**
* hitTest的作用:用来找到最合适的view
* hitTest什么时候调用:当触摸事件传递给一个控件的时候,就会调用hitTest寻找最合适的view处理事件
* @param point 以方法调用者视图为坐标系的触摸点,方便判断点在不在视图上
* @param event 触摸事件
*
* @return 返回最合适的view
*/
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"%@ ------- hitTest ------%d",[self class],event.type);
/*
1.判断能不能处理事件(1.不能交互2.hiddle = yes 3.alpha <= 0.01)
2.判断点在不在当前控件上
3.反向遍历子控件,把事件传递给子控件,让子控件寻找有没有比自己更合适的view
*/
// 1.判断能不能处理事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
// 2.判断点在不在当前控件上
if (![self pointInside:point withEvent:event]) return nil;
// 3.反向遍历子控件
int count = 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;
}
}
return self;
}