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

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

http://www.lryc.cn/news/359472.html

相关文章:

  • C# 工厂模式学习
  • AI生成微信职业头像
  • 遥感图像的深度学习的任务类型
  • 162.二叉树:填充每个节点的下一个右侧节点指针(力扣)
  • NLP(20)--知识图谱+实体抽取
  • 【mysql数据库】mycat中间件
  • 满帮集团 Eureka 和 ZooKeeper 的上云实践
  • ubuntu中彻底删除mysql (配置文件删除可选)
  • 根据模板和git commit自动生成日·周·月·季报
  • matlab GUI界面设计
  • MyBatis 面试题
  • C#根据数据量自动排版标签的样例
  • 【网络安全】Web安全基础 - 第一节:使用软件及环境介绍
  • Mac下载docker
  • k8s_设置dns
  • 翻译《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)
  • SA316系列音频传输模块-传输距离升级音质不打折
  • 【机器学习】智能选择的艺术:决策树在机器学习中的深度剖析
  • 电脑缺少运行库,无法启动程序
  • 【计算机软考_初级篇】每日十题2
  • HR人才测评,如何做营销人员岗位素质测评?
  • LabVIEW调用第三方硬件DLL常见问题及开发流程
  • datax实现MySQL数据库迁移shell自动化脚本
  • PostgreSQL的学习心得和知识总结(一百四十四)|深入理解PostgreSQL数据库之sendTuples的实现原理及功能修改
  • C++数据结构之:链List
  • 10.Redis之set类型
  • SpringBoot + mongodb 删除集合中的数据
  • 【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览
  • 每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符
  • 爬虫学习--18.反爬斗争 selenium(3)