美文网首页
事件响应机制

事件响应机制

作者: _RG | 来源:发表于2019-12-19 14:40 被阅读0次

    当手指触摸屏幕时, 会生成一个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;
    }
    
    

    相关文章

      网友评论

          本文标题:事件响应机制

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