iOS HitTest 机制
当用户触摸(Touch)屏幕进行交互时,系统首先要找到响应者(Responder)。系统检测到手指触摸(Touch)操作的时候,将Touch
以UIEvent 的方式加入到UIApplication 事件队列中去。UIApplication 从事件队列中取出最新的触摸事件进行分发传递到UIWindow 进行处理
.UIWindow 会通过hit Test:WithEvent 方法寻找触碰点所在的视图。这个过程称之为hit-test view。
顺序如下
UIApplication --》UIWindow—》Root view —> subview
在顶级视图(Root View) 上调用pointInside:withEvent 方法判断触摸点是否在当前视图内;
如果返回NO,那么hitTest:withEvent 返回nil
如果返回YES,那么会向当前视图的所有子视图发送hitTest:WithEvent 消息,所有子视图的遍历顺序是从最顶层视图一直到最底层视图,即从subviews 数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕。
如果有subview 的hitTest:WithEvent 返回非空对象则返回此对象,处理结束。
此过程,子视图也是根据pointInSide:WithEvent 返回值来确定是返回空还是当前子视图对象的。并且这个过程如果子视图的hidden=yes
userInteractionEnabled=NO或者alpha小于0.1都会并忽略。
如果所有subview 遍历结束仍然没有返回非空对象,则hitTest:WithEvent 返回self
系统就是这样通过hit test 找到触碰到的视图(initial View)进行响应。
// 此方法就是寻找最为合适的响应的空间override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {super.hitTest(point, with: event);// 1 UIView不接收触摸事件的三种情况:// * userInteractionEnabled = NO
// * hidden = YES
// * lpha = 0.0 ~ 0.01if self.isUserInteractionEnabled == false || self.alpha <= 0.1 || self.isHidden == true {return nil;}// 2 判断当前的点是否在此控件上面if self.point(inside: point, with: event) == false {return nil;}// 3 以上条件都满足 去遍历自己的子空间let count = self.subviews.count;for view in self.subviews {// 转为目标控件的点let current_point = self.convert(point, to: view);// 让子视图再去遍历 如果有的话 进行返回操作 没有的话 不要紧 返回nil就好了if view.hitTest(current_point, with: event) != nil {return view;}}// 4 如果以上都没有找到 那就返回自己return self;}
iOS HitTest 机制相关推荐
- 『iOS开发』iOS 签名机制
iOS 签名机制 对称加密(Symmetric Cryptography) 对称加密指的是发送端和接收端使用同一种算法对 明文(Plain Text) 进行 加密(Encrypt) 或对 密文(Cip ...
- android 绘画笔迹回放_简笔画项目总结: ios绘图机制 实现记录笔迹功能
简笔画的项目是从暑期8月份开始的,差不多9月多的时候已经有出版,修修改改拖到现在才算能结项目. 现在来总结有点晚了,一些体会早忘记了,但我还是尽力回忆一些自己认为有用的东西记录一下. 1.故事板.我在 ...
- iOS事件机制(一)
本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远程控制事件(远程遥控iOS设备多媒体 ...
- iPhone App开发实战手册学习笔记(5)之IOS常用机制
1 前言 在IOS开发中,相信大家一定听说过委托,数据源,target,action等等,今天我们就来简单的学习一下这些内容. 2 详述 2.1 委托和数据源 大家是否曾经有不知道如何去执行一项任务的 ...
- iOS 扩展机制category与associative
category和associative作为objective-c 扩展机制的两个特性,category可以通过它来扩展方法:associative可以通过它来扩展属性. 在iOS开发过程中,前者ca ...
- 关于IOS内存机制的较深入分析
首先说明这些是根据开发者们的文章复制黏贴组合得来的,有不正确的还请指正 懒得看的可以直接往下看结论 1内存调用机制 iOS本身的内存调用机制与Mac同源,但是与Windows有本质的区别. Windo ...
- ios加密机制是什么?为什么无法破解?
0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非常不友好,往往不知从何入手.因此,为了让大家能够更加系统性的了解iO ...
- 深入了解ios系统机制
1.什么叫ios? ios一般指ios(Apple公司的移动操作系统) . 苹果iOS是由苹果公司开发的移动操作系统.苹果公司最早于2007年1月9日的Macworld大会 ...
- iOS开发笔记之五十九——OS X和iOS安全机制之一——签名机制
一.背景 在OS X上病毒和恶意软件很少见,给大家的感觉是OS X和iOS更加安全.到底是什么原因导致的OS X更加安全呢? (1)OS X占有率较低,没有吸引足够的恶意软件开发者的注意(假设你是恶意 ...
最新文章
- Lombok经常用,却不知道它的原理是什么
- 汉字转拼音插件:LM-PinYin.js
- 产品经理整理PRD时,需要注意哪些点
- SpringBoot 数据验证错误处理
- numpy函数:[6]arange()详解
- 山西上党残疾男子“只”手脱贫 带领村民增收
- 设计模式--程序猿必备面向对象设计原则
- orm框架选型问题_ORM问题
- manjaro linux 关机,给本子安装manjaro 出现无法关机的解决办法
- 【学习笔记】在storyboard中给TabViewController添加tab页面
- 2年质保期刚过就翘辫子,这是什么骚设计?
- 颜色模型和颜色应用---颜色选择及其应用
- Hibernate笔记7--JPA CRUD
- HTTP 之 HTTPD介绍
- MATLAB表示非线性系统,matlab非线性控制系统分析.ppt
- 项目管理十大知识领域和五大过程
- 1222-周一开盘红红火火大涨的一天。EG,PVC,沪铜,国际铜,纯碱涨停
- 百度排名批量查询_企业网站建设,核心关键词排名丢失,怎么办?
- 计算机专业就业崩溃,计算机专业就业“遇冷说”引发争议
- Android开发中WIFI和GPRS网络的切换
热门文章
- 【转】MySQL常用命令总结
- 【LeetCode】136. Single Number 解题小结
- 匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔...
- iOS开发之绝对布局和相对布局(屏幕适配)
- HDU 2717 Catch That Cow(BFS)
- MOSS的CSS样式说明,一个老外总结的
- Linux时间转化方法
- 按下回车键指向下一个位置的一个函数
- web.config文件详解
- 如果有大型 Web 应用程序,可考虑执行预批编译