核心方法
// 事件傳遞
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
// 在不在里 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
hitTest底層實現(xiàn)底層實現(xiàn)
1.判斷當前能不能接收事件
if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01)
returnnil;
2.判斷觸摸點在不在當前的控件上
if(![self pointInside:point withEvent:event]) return nil;
3.從后往前遍歷自己的子控件
int count = (int)self.subviews.count;
for (int i = count - 1; i >= 0;i-- ) {
UIView *childV = self.subviews[i];
把當前坐標系上的點轉(zhuǎn)換成子控件坐標系上的點.
CGPoint childP =[self convertPoint:point toView:childV];
判斷自己的子控件是不是最適合的View
UIView *fitView =[childV hitTest:childP withEvent:event];
如果子控件是最適拿的View,直接返回
if (fitView) {
returnfitView;
}
}
4.自己就是最適合的View
return self.
image.png