美文网首页
iOS hitTest:withEvent:原理分析以及实现猜测

iOS hitTest:withEvent:原理分析以及实现猜测

作者: 别样的风 | 来源:发表于2017-08-21 12:15 被阅读25次

HitTest的主要目的就是找到对于UIEvent的响应者,本文实现代码是根据apple文档描述的一种猜测实现,帮助大家理解原理

- (UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event{
    
    //apple文档描述,不接受事件的情况
    if (self.userInteractionEnabled == NO || self.isHidden == YES || self.alpha < 0.01) {
        return nil;
    }
    
    //如果当前View包含此Point
    if ([self pointInside:point withEvent:event]) {
        
        //遍历子View,这里注意要从后往前遍历,因为后面的是越靠近用户的
        for (NSInteger i=self.subviews.count-1; i>=0; i--) {
            
            UIView* subView = [self.subviews objectAtIndex:i];
            
            //将父View的Point转换成子View坐标系的Point
            CGPoint pointInSubView = [subView convertPoint:point fromView:self];
            
            //递归子View调用HitTest:
            UIView* resultView = [subView hitTest:pointInSubView withEvent:event];
            
            //找到了子View可以响应
            if (resultView) {
                return resultView;
            }
            
        }
        
        //没有找到可以响应的子View,返回自己
        return self;
    }
    
    //返回nil,告诉上一级自己无法响应此事件
    return nil;
}

流程图总结

image.png

相关文章

网友评论

      本文标题:iOS hitTest:withEvent:原理分析以及实现猜测

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