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

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];
    }
    }
    哦了.这种情况很常见的,自己体会喽

你可能感兴趣的:(无法点击的视图怎么加点击事件)