hit-testing机制介绍
1.简介
寻找处理触摸事件的view的过程为hit-testing,找到的能够处理触摸事件的view叫做hit-test view。
2.机制介绍
假设下图为我们的手机屏幕,当我们假设点击了view E那么他的整个寻找过程是这样的:
1.点击点坐标是在 View A区域,所以讲会继续检查View A的subview View B和View C
2.发现点击点坐标不再view B区域而是在View C区域,所以将会继续检查View C的subview View D和View E
3.点击点不在View D区域,但是他在View E区域,于是去检查View E的subview,但是发现VIew B已经没有subview,于是View B被确定为hit-test view

从代码上来说,它主要执行了UIView的- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法,内部是调用
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event方法,
1.如果当前传入的point在当前UIView对象的bounds范围内则返回true,
随后在所有只要-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event方法返回为true的subview上递归调用- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法直到最终找出hit-test view
用代码来描述的话好比是这样:
-(UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// 如果point在当前view的bounds中
if ([self pointInside:point withEvent:event]) {
// 在所有其subview上去寻找hit-test view
for (UIView *view in self.subviews) {
return [view hitTest:point withEvent:event];
}
}
}
2.如果当前传入的point不再当前UIView对象的bounds范围内则返回false
那么当前- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法将返回nil,此后所有其subview的检查都将忽略,应为如果point不再superview上那么肯定
不再subview上。
这样我们就找到了hit-test view来处理事件,但是但是但是这个hit-test view根本就不关心这个事件(没有覆盖相关方法)则这个事件将被扔进响应者链中寻找主人了~~
3.特殊情况clipsToBounds
clipsTonbounds是设置subview超出superview的部分是否裁剪掉的属性,此属性是设置在superView上的。
NO(默认):

YES:

那么问题来了,如果我们点击超出黄色部分的红色区域会触发touch事件吗?
也就说点击不再superView区域的subView区域。
证明:
1.新建UIView子类,作用于当前subView(红色块)上:
#import "XFSubView.h"
@implementation XFSubView
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@", @"Do touchBegan!");
}
-(void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
}
-(void) touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
}
-(void) touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesCancelled:touches withEvent:event];
}
@end
2.点击黄色区域范围内的红色区域:
结果:打印日志。
3.点击黄色区域范围外的红色区域:
结果:不打印日志。
总结:即使是父子关系的view,只有子view的范围在父view的范围内的控件部分才能接受touch事件。
hit-testing机制介绍的更多相关文章
- iOS 阶段学习第25天笔记(iOS沙盒机制介绍)
iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...
- iOS沙盒机制介绍,Block 的介绍
一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...
- Linux 内核的文件 Cache 管理机制介绍
Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- Html5 Canvas Hit Testing
名词解释: Shape : 矢量图形,点线面之类的: Hit Testing : 点击测试: 参考内容: A Gentle Introduction to Making HTML5 Canvas In ...
- redis锁机制介绍与实例
转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...
- 线程安全的集合类、CopyOnWrite机制介绍(转)
看过并发编程的书,这两种机制都有所了解,但不扎实其实.看到别人的博客描述的很精辟,于是转过来,感谢! 原文链接:https://blog.csdn.net/yen_csdn/article/detai ...
- nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍
转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...
- Binder通信机制介绍
1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Android会另起炉灶,采用Binder.接着,会根据 Binder的机制,去理解什么是Serv ...
随机推荐
- [LOJ#2542] [PKUWC2018] 随机游走
题目描述 给定一棵 n 个结点的树,你从点 x 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 Q 次询问,每次询问给定一个集合 S,求如果从 x 出发一直随机游走,直到点集 S 中所有点都 ...
- [洛谷P5105]不强制在线的动态快速排序
题目大意:有一个可重集$S$,有两个操作: $1\;l\;r:$表示把$S$变为$S\cup[l,r]$ $2:$表示将$S$从小到大排序,记为$a_1,a_2,\dots,a_n$,然后求出$\bi ...
- [NOIP2012 TG D2T1]同余方程
题目大意:求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 题解:即求a在mod b意义下的逆元,这里用扩展欧几里得来解决 C++ Code: #include<cstdio ...
- BZOJ1043:[HAOI2008]下落的圆盘——题解(配图片)
http://www.lydsy.com/JudgeOnline/problem.php?id=1043 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周 ...
- CF498D:Traffic Jams in the Land——题解
https://vjudge.net/problem/CodeForces-498D http://codeforces.com/problemset/problem/498/D 题面描述: 一些国家 ...
- 【图论】Floyd消圈算法
毫无卵用的百度百科 Definition&Solution 对于一个给定的链表,如何判定它是否存在环以及环的长度问题,可以使用Floyd消圈算法求出. 从某种意义上来讲,带环的链表在本质上是一 ...
- ZOJ1586:QS Network (最小生成树)
QS Network 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 Description: In th ...
- 题解【luoguP3644 [APIO2015]八邻旁之桥】
题目链接 题解 家和公司在同侧 简单,直接预处理掉 若 \(k=1\) 取所有的居民的\(\frac{家坐标+公司坐标}{2}\)的所有坐标的正中间建一座桥,使所有居民到的距离最小. 实现方法:线段树 ...
- lnmp git ruby sass 安装
1 cd .. 2 ls 3 cd mzx/ 4 ls 5 cd 桌面 6 cd lnmp1.4-full/ //到lnmp 的官网上下载后,根据官网的提示来安装lump 7 ls 8 install ...
- RabbitMQ 作用
1.RabbitMQ 作用 同步变异步 解耦 削峰 2.