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机制介绍的更多相关文章

  1. iOS 阶段学习第25天笔记(iOS沙盒机制介绍)

    iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...

  2. iOS沙盒机制介绍,Block 的介绍

    一.iOS沙盒机制介绍 (转载) 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访 ...

  3. Linux 内核的文件 Cache 管理机制介绍

    Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...

  4. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  5. Html5 Canvas Hit Testing

    名词解释: Shape : 矢量图形,点线面之类的: Hit Testing : 点击测试: 参考内容: A Gentle Introduction to Making HTML5 Canvas In ...

  6. redis锁机制介绍与实例

    转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...

  7. 线程安全的集合类、CopyOnWrite机制介绍(转)

    看过并发编程的书,这两种机制都有所了解,但不扎实其实.看到别人的博客描述的很精辟,于是转过来,感谢! 原文链接:https://blog.csdn.net/yen_csdn/article/detai ...

  8. nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍

    转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...

  9. Binder通信机制介绍

    1.Binder通信机制介绍 这篇文章会先对比Binder机制与Linux的通信机制的差别,了解为什么Android会另起炉灶,采用Binder.接着,会根据 Binder的机制,去理解什么是Serv ...

随机推荐

  1. CentOS 普通用户提升root权限

    1.sudo命令可以使普通用户具备root用户的权限,使用前,需要先配置/etc/sudoers文件. #sudoers文件是只读,一般情况下都是用visudo来修改,visudo也一定程度上可以保证 ...

  2. 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1254  Solved: 799[Submit][Statu ...

  3. 【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人

    题解:hzw大神的博客说的很清楚嘛 http://hzwer.com/1941.html 朴素的做法就是每个点如果它不是墓地那么就可形成十字架的数量就是这个c(点左边的树的数量,k)*c(点右边的树的 ...

  4. 51nod 1196 字符串的数量(DP+数论?)

    这题好像是神题...V1 V2 V3分别涵盖了51nod 5级算法题 6级算法题 难题 讨论区的曹鹏神牛好强啊...一种做法切了V1 V2 V3,而且做法是一步一步优化的 还没去看优化的部分,未优化已 ...

  5. 图片上传(方法一:jquery.upload.js)

    一.在JSP页面引入jquery.upload.js 文件: <script type="text/javascript" src="${ctx}/script/j ...

  6. Network LCA修改点权

    Problem Description The ALPC company is now working on his own network system, which is connecting a ...

  7. 【题解】Huge Mods UVa 10692 欧拉定理

    题意:计算a1^( a2^( a3^( a4^( a5^(...) ) ) ) ) % m的值,输入a数组和m,不保证m是质数,不保证互质 裸的欧拉定理题目,考的就一个公式 a^b = a^( b % ...

  8. bzoj 1568 [JSOI2008]Blue Mary开公司 超哥线段树

    [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1808  Solved: 639[Submit][Sta ...

  9. jq 由name获取那个radio选中了的

    $("input[name='approve']:checked").val() //获取radio选中的值;var radio_checked_val = $("#fo ...

  10. http基础(1.了解web及网络基础,2.简单的http协议)

    第一章:了解web及网络基础 1.http:超文本传输协议 2.tcp/ip协议族:通常使用的网络是在tcp/ip协议族的基础上运作的,而http属于它内部的一个子集. 3.tcp/ip协议族按层次分 ...