hitTest方法与PointInside方法

    
    作用:寻找最适合的View
    参数:当前手指所在的点.产生的事件
    返回值:返回谁, 谁就是最适合的View.
    什么时候用调用:只要一个事件,传递给一个控件时, 就会调用这个控件的hitTest方法
    -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    
    作用:判断point在不在方法调用者上
    point:必须是方法调用者的坐标系
    什么时候调用:hitTest方法底层会调用这个方法,判断点在不在控件上.
    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
        return YES;
    }
    
    
    hitTest底层实现:
        
        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 = (int)self.subviews.count;
        for (int i = count - 1; i >= 0;i-- ) {
        
        UIView *childV = self.subviews[i];
        把当前坐标系上的点转换成子控件坐标系上的点.
        CGPoint childP = [self convertPoint:point toView:childV];
        判断自己的子控件是不是最适合的View
        UIView *fitView = [childV hitTest:childP withEvent:event];
        如果子控件是最适拿的View,直接返回
            if (fitView) {
                return  fitView;
            }
        }

        4.自己就是最适合的View
            return self.

原文地址:https://www.cnblogs.com/xufengyuan/p/6980428.html