当前位置: 首页 > news >正文

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 方法

相关文章:

  • 【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
  • ChatGPT-3
  • 【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL
  • 【原创】springboot+mysql员工管理系统
  • springboot基础及上传组件封装
  • 数据结构-堆(带图)详解
  • 制作ChatPDF之Elasticsearch8.13.4搭建(一)
  • 解决TrueNas Scale部署immich后人脸识别失败,后台模型下载异常,immich更换支持中文搜索的CLIP大模型
  • leetcode1:两数之和
  • Android manifest清单文件意外权限来源和合并规则
  • 设计模式之桥接模式
  • 单片机原理及应用复习
  • AI前沿技术探索:智能化浪潮下的创新与应用
  • 首套真题解析!安徽211难度适中!两门课!
  • 第十三章 进程与线程
  • 冒泡排序与快速排序
  • 基于昇腾910B训练万亿参数的语言模型简介
  • Maven打包错误:无效的源发行版:17
  • 字符串和字节串
  • linux 利用 ~$() 构造数字
  • 【社论】职业上新,勇于“尝新”
  • 国家主席习近平在莫斯科出席红场阅兵式
  • 读图|展现城市品格,上海城市影像走进南美
  • 阿森纳被打得毫无脾气,回天无力的阿尔特塔只剩嘴硬
  • 特色业务多点开花,苏州银行擦亮金融为民底色
  • 计划招录2577人,“国考”补录8日开始报名