iOS Hittest 机制和实际应用之一 hittest方法

Hittest 机制原理

hitTest的原理就是,当我们点击的时候,会触发 window的

hittest方法,在该方法中会首先使用point inside方法判断

点击的地方是否在window范围内,如果在的话,就倒序遍历姿子视图,然后将point转换为相对于子视图的point,然后在子视图再执行hittest,里面执行同样的流程。如果不在window范围内的话,就返回一个nil

这里写下实现逻辑

复制代码
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    
    if (self.hidden == NO || self.alpha < 0.05 || self.userInteractionEnabled == NO) {
        //1.当满足这几个条件时,直接丢弃touch事件,不再向下分发。
        return nil;
    }else{
        if (![self pointInside:point withEvent:event]) {
            //2.如果点击point在视图之外,丢弃
            return nil;
        }else{
            //3.分发给子视图
            if (self.subviews.count > 0) {
                for (UIView *subView in self.subviews) {
                    UIView *hitTestSubView = [subView hitTest:point withEvent:event];
                    return hitTestSubView;
                }
            }else{
                return self;
            }
        }
    }
}

实际应用

扩大点击范围

重写 hitTest 方法,通过UIEdgeInsetsInsetRect 方法生成一个新的frame,然后判断point是否在rect里面

复制代码
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
   
    CGRect rect = UIEdgeInsetsInsetRect(self.bounds, self.expandEdgeInset);
    if (CGRectContainsPoint(rect, point)) {
        return self;
    }
    return [super hitTest:point withEvent:event];
}

子视图超出父视图可点击

重写 hitTest 方法 在里面不执行 point inside方法(系统默认是要执行的,因为要判断点击的点是否在自己范围内)

复制代码
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint pointInSubbutton = [self convertPoint:point toView:self.subButton];
    if ([self.subButton hitTest:pointInSubbutton withEvent:event]) {
        return [self.subButton hitTest:pointInSubbutton withEvent:event];
    }
    return [super hitTest:point withEvent:event];
}

其实从上面的逻辑来看,不管我们是扩大点击范围,还是子视图超出范围可以点击,

都是去掉了系统hitest方法中的point inside 方法

相关推荐
Zender Han17 小时前
Flutter Bloc / Cubit 最新详解与实战指南(2026版)
android·flutter·ios
tangweiguo0305198720 小时前
iOS vs Android 开发对照手册
android·ios
weixin_4434785121 小时前
flutter组件学习之Cupertino 组件(iOS风格)
学习·flutter·ios
Andy_GF2 天前
iOS26 系统适配-直接隐藏 UIBarButtonItem 的 Liquid glass 效果
ios
wjm0410062 天前
ios学习路线-- swift基础2
学习·ios·swift
开心就好20252 天前
全面解析WhatsApp Web抓包:原理、工具与安全
后端·ios
程序喵大人2 天前
OpenClaw的成功是AI Agent的“iPhone时刻”吗?
人工智能·ios·iphone·openclaw
marteker2 天前
苹果的冰球营销:用iPad设计面具,讲述科技之外的情感故事
科技·ios·ipad
H_老邪2 天前
贪心算法的应用
算法·ios·贪心算法
UXbot2 天前
APP原型生成工具测评
android·前端·人工智能·低代码·ios·开发·app原型