当用户触摸(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 机制相关推荐

  1. 『iOS开发』iOS 签名机制

    iOS 签名机制 对称加密(Symmetric Cryptography) 对称加密指的是发送端和接收端使用同一种算法对 明文(Plain Text) 进行 加密(Encrypt) 或对 密文(Cip ...

  2. android 绘画笔迹回放_简笔画项目总结: ios绘图机制 实现记录笔迹功能

    简笔画的项目是从暑期8月份开始的,差不多9月多的时候已经有出版,修修改改拖到现在才算能结项目. 现在来总结有点晚了,一些体会早忘记了,但我还是尽力回忆一些自己认为有用的东西记录一下. 1.故事板.我在 ...

  3. iOS事件机制(一)

    本篇内容将围绕iOS中事件及其传递机制进行学习和分析.在iOS中,事件分为三类: 触控事件(单点.多点触控以及各种手势操作) 传感器事件(重力.加速度传感器等) 远程控制事件(远程遥控iOS设备多媒体 ...

  4. iPhone App开发实战手册学习笔记(5)之IOS常用机制

    1 前言 在IOS开发中,相信大家一定听说过委托,数据源,target,action等等,今天我们就来简单的学习一下这些内容. 2 详述 2.1 委托和数据源 大家是否曾经有不知道如何去执行一项任务的 ...

  5. iOS 扩展机制category与associative

    category和associative作为objective-c 扩展机制的两个特性,category可以通过它来扩展方法:associative可以通过它来扩展属性. 在iOS开发过程中,前者ca ...

  6. 关于IOS内存机制的较深入分析

    首先说明这些是根据开发者们的文章复制黏贴组合得来的,有不正确的还请指正 懒得看的可以直接往下看结论 1内存调用机制 iOS本身的内存调用机制与Mac同源,但是与Windows有本质的区别. Windo ...

  7. ios加密机制是什么?为什么无法破解?

    0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非常不友好,往往不知从何入手.因此,为了让大家能够更加系统性的了解iO ...

  8. 深入了解ios系统机制

    1.什么叫ios?        ios一般指ios(Apple公司的移动操作系统) .        苹果iOS是由苹果公司开发的移动操作系统.苹果公司最早于2007年1月9日的Macworld大会 ...

  9. iOS开发笔记之五十九——OS X和iOS安全机制之一——签名机制

    一.背景 在OS X上病毒和恶意软件很少见,给大家的感觉是OS X和iOS更加安全.到底是什么原因导致的OS X更加安全呢? (1)OS X占有率较低,没有吸引足够的恶意软件开发者的注意(假设你是恶意 ...

最新文章

  1. Lombok经常用,却不知道它的原理是什么
  2. 汉字转拼音插件:LM-PinYin.js
  3. 产品经理整理PRD时,需要注意哪些点
  4. SpringBoot 数据验证错误处理
  5. numpy函数:[6]arange()详解
  6. 山西上党残疾男子“只”手脱贫 带领村民增收
  7. 设计模式--程序猿必备面向对象设计原则
  8. orm框架选型问题_ORM问题
  9. manjaro linux 关机,给本子安装manjaro 出现无法关机的解决办法
  10. 【学习笔记】在storyboard中给TabViewController添加tab页面
  11. 2年质保期刚过就翘辫子,这是什么骚设计?
  12. 颜色模型和颜色应用---颜色选择及其应用
  13. Hibernate笔记7--JPA CRUD
  14. HTTP 之 HTTPD介绍
  15. MATLAB表示非线性系统,matlab非线性控制系统分析.ppt
  16. 项目管理十大知识领域和五大过程
  17. 1222-周一开盘红红火火大涨的一天。EG,PVC,沪铜,国际铜,纯碱涨停
  18. 百度排名批量查询_企业网站建设,核心关键词排名丢失,怎么办?
  19. 计算机专业就业崩溃,计算机专业就业“遇冷说”引发争议
  20. Android开发中WIFI和GPRS网络的切换

热门文章

  1. 【转】MySQL常用命令总结
  2. 【LeetCode】136. Single Number 解题小结
  3. 匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔...
  4. iOS开发之绝对布局和相对布局(屏幕适配)
  5. HDU 2717 Catch That Cow(BFS)
  6. MOSS的CSS样式说明,一个老外总结的
  7. Linux时间转化方法
  8. 按下回车键指向下一个位置的一个函数
  9. web.config文件详解
  10. 如果有大型 Web 应用程序,可考虑执行预批编译