iOS自定义控件及相关iOS干货

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

2016-03-12  本文已影响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;
    
    
}
上一篇下一篇

猜你喜欢

热点阅读