iOS

iOS hitTest方法&pointInside方法

发布于 2020-01-12 22:12:50
关注者
0
被浏览
810
1 个回答
  • 面试哥
    面试哥 2020-01-12
    为面试而生,有面试问题,就找面试哥。

    hitTest方法

    • 当事件传递给控件的时候,就会调用控件的这个方法,去寻找最合适的view
    • point:当前的触摸点,point这个点的坐标系就是方法调用者

     

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
    

    pointInside方法

    • 作用:判断当前这个点在不在方法调用者(控件)上

     

    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
    

    hitTest:withEvent:的实现原理

     

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)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.从后往前遍历自己的子控件
        NSInteger count = self.subviews.count;
    
        for (NSInteger 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) { // 寻找到最合适的view
                return fitView;
            }
        }
        // 循环结束,表示没有比自己更合适的view
        return self;
    }
    

知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看