事件响应机制

2019-12-19  本文已影响0人  _RG

当手指触摸屏幕时, 会生成一个UIEvent的对象从UIWindow往子控件进行传递

首先会使用UIWindow 调用 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 方法

通过- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event 方法判断点落在自己的范围内否, 如果不在就返回nil,

如果自己能接收事件, 就遍历自己的子控件, 看是否有子控件能接收事件, 如果有就继续往下一级遍历, 如果没有, 则最终自己就是最合适的响应者

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    
    NSLog(@"点击了%@",[super hitTest:point withEvent: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.从后往前遍历自己的子控件
    // 1 0
    int count = (int)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;
        }
        
    }
    // 4.如果没有比自己合适的子控件,最合适的view就是自己
    return self;
}

上一篇下一篇

猜你喜欢

热点阅读