美文网首页iOS自定义控件及相关iOS干货
iOS hitTest(界面事件处理逻辑)

iOS hitTest(界面事件处理逻辑)

作者: 锅锅中的鱼 | 来源:发表于2016-03-12 03:18 被阅读298次

    关于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;
        
        
    }
    

    相关文章

      网友评论

      • 大号鱼骨头:楼主,你上面的总结是 就调用touchesBegan相关事件一层层回传,如果未被拦截,最终传到UIApplication,然后开始处理事件了?
      • 写一本2000000的书:这个在开发中用得比较少,楼主,能否举几个应用场景
        锅锅中的鱼:@写一本2000000的书 例如指导用户点击一个按钮 还有底部tabbar中间的不规则按钮都可以这样实现 或者要设计一个圆形按钮

      本文标题:iOS hitTest(界面事件处理逻辑)

      本文链接:https://www.haomeiwen.com/subject/ambzkttx.html