美文网首页程序员iOS DeveloperiOS学习笔记
无法点击的视图怎么加点击事件

无法点击的视图怎么加点击事件

作者: 蒋昉霖 | 来源:发表于2016-03-15 10:41 被阅读156次

    hitText和pointInside

    最近准备看点HTML5的东西,时间有点少,写一点简单的东西吧

    介绍两个方法

    // 用于拦截点击方法,使不能交互的视图出现交互效果
    // 事件传递的时候使用
    // 当事件传递给控件的时候调用
    // 寻找最合适的View进行处理,倒叙遍历
    // point:当前的触摸点,point的这个坐标系就是方法的调用者
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        // 调用系统的做法去寻找最合适的view,返回最合适的view
        UIView *fitView = [super hitTest:point withEvent:event];  
        return fitView;
    }
    // 作用:判断当前这个点在不在方法调用者(控件)上
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        return YES;
    }
    
    

    这两个方法一般配合使用

    底层实现

    // 点击视图 -》 事件 -》 UIApplication -> UIWindow
    // 因为所有的视图类都是继承BaseView
    - (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;
    }
    

    举个简单的应用例子
    需求:
    一个视图被一个蒙版挡住了,我们需要通过蒙版点击这个视图

    • (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
      {
      // 当前坐标系上的点转换到按钮上的点
      CGPoint btnP = [self convertPoint:point toView:self.btn];

      // 判断点在不在按钮上
      if ([self.btn pointInside:btnP withEvent:event]) {
      // 点在按钮上
      return self.btn;
      }else{
      return [super hitTest:point withEvent:event];
      }
      }
      哦了.这种情况很常见的,自己体会喽

    相关文章

      网友评论

        本文标题:无法点击的视图怎么加点击事件

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