关于UIView的触摸响应事件中,这里有一个常常容易迷惑的方法hitTest:WithEvent。先来看官方的解释:This method traverses the view hierarchy by sending the pointInside:withEvent: message

to each subview to determine which subview should receive a touch event.

If pointInside:withEvent: returns YES, then the subview’s hierarchy is traversed;
 otherwise, its branch of the view hierarchy is ignored.

You rarely need to call this method yourself,

but you might override it to hide touch events from subviews.(通 过发送PointInside:withEvent:消息给每一个子视图,这个方法遍历视图层树,来决定那个视图应该响应此事件。如果 PointInside:withEvent:返回YES,然后子视图的继承树就会被遍历;否则,视图的继承树就会被忽略。你很少需要调用这个方法,仅仅 需要重载这个方法去隐藏子视图的事件)。从官方的API上的解释,可以看出 hitTest方法中,要先调用 PointInside:withEvent:,看是否要遍历子视图。如果我们不想让某个视图响应事件,只需要重载 PointInside:withEvent:方法,让此方法返回NO就行了。不过从这里,还是不能了解到hitTest:WithEvent的方法的用 途。

下面再从”Event Handling Guide for iOS”找答案,Your custom responder can use hit- testing to find the subview or sublayer of itself that is "under” a touch, and then handle the event appropriately。从中可以看出hitTest主要用途是用来寻找那个视图是被触摸了。看到这里对hitTest的调用过程还是一知半解。我们可以实际建立一个工程进行调试。建立一个MyView里面重载hitTest和pointInside方法:

[plain] view plaincopy
  1. - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
  2. [super hitTest:point withEvent:event];
  3. return self;
  4. }
  5. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
  6. NSLog(@"view pointInside");
  7. return YES;
  8. }

然后在MyView中增加一个子视图MySecondView也重载这两个方法

[plain] view plaincopy
  1. - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
  2. [super hitTest:point withEvent:event];
  3. return self;
  4. }
  5. - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
  6. NSLog(@"second view pointInside");
  7. return YES;
  8. }

这里注意[super hitTest:point withEvent:event];必须要包括,否则hitTest无法调用父类的方法,这样就没法 使用PointInside:withEvent:进行判断,那么就没法进行子视图的遍历。当去掉这个语句的时候,触摸事件就不可能进到子视图中了,除非 你在方法中直接返回子视图的对象。这样你在调试的过程中就会发现,每次你点击一个view都会先进入到这个view的父视图中的hitTest方法,然后 调用super的hitTest方法之后就会查找pointInside是否返回YES如果是,则就把消息传递个子视图处理,子视图用同样的方法递归查找 自己的子视图。所以从这里调试分析看,hitTest方法这种递归调用的方式就一目了然了。

转载于:https://www.cnblogs.com/jinjiantong/archive/2013/05/03/3056561.html

[ios2] UIView的hitTest,pointInside方法详解【转】相关推荐

  1. ios 获取html的高度,iOS Webview自适应实际内容高度的4种方法详解

    //第一种方法 - (void)webViewDidFinishLoad:(UIWebView *)webView { CGFloat webViewHeight=[webView.scrollVie ...

  2. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  3. python修改文件内容_Python批量修改文本文件内容的方法详解

    这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...

  4. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  5. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  6. golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...

    Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...

  7. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  8. linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从 ...

  9. 饥荒怎么自动订阅服务器,饥荒联机版自动挂礼物mod及使用方法详解

    饥荒联机版中官方经常会推出一些挂机掉落礼物的活动,可能一些玩家会觉得很麻烦,下面给大家分享一些自动挂礼物mod和其使用方法,希望可以帮助到各位玩家. 饥荒联机版自动挂礼物mod及使用方法详解 挂礼物m ...

最新文章

  1. librosa.stft() 短时傅里叶变换
  2. struts2中用户登陆验证的常用方法
  3. ASCII、GB2312、GBK、Unicode、UTF-8介绍和转换
  4. 使用 HTML5 canvas 绘制精美的图形
  5. Linux笔记-centos7源码安装Mysql5.6(图解详细)
  6. java静态方法求n,java之静态属性和静态方法
  7. 机器学习-数据科学库-day1
  8. 音视频重新封装的流程
  9. 配送中心数据迁移项目(SDC to PDC Data Migartion)
  10. ssh 遍历IPS 进行连接
  11. Oracle 根据dbf文件的数据恢复
  12. 预应力钢筒混凝土管(PCCP)行业发展现状及竞争格局分析报告2022-2027年版
  13. oracle sla 设置文档,Oracle EBS SLA 详解(转)
  14. java计算机毕业设计网上鲜花交易平台源代码+数据库+系统+lw文档
  15. html小吃制作,最简单易学的12种小吃的做法|小吃|简单易学
  16. Win10正式版微软官方原版ISO系统镜像下载大全
  17. 《认知与设计——理解UI设计准则》笔记(1) 我们感知自己的期望
  18. Nexus Repository和Docker Registry镜像仓库搭建及使用
  19. Invalid initial heap size: -Xms128m-Xmx512
  20. Mysql 利用存储过程 实现单据号码(单号)生成器(万能版)

热门文章

  1. 后台管理系统好用的UI框架
  2. 数据结构与算法 | LeetCode 224. Basic Calculator
  3. 人人网,微博,QQ空间,朋友圈,常用API调用实现方法
  4. PostgreSQL 9.5.3中文手册正式发布(附pdf和chm)
  5. /bin/sh^M:损坏的解释器: 没有那个文件或目录
  6. LeetCode数据库 176. 第二高的薪水
  7. MATLAB Simulink中自定义函数和switch case的用法
  8. delphi 监控文件变化_监控Linux文件变化,防止系统被黑
  9. Eclipse调试时出现source not found的问题
  10. ShuttleFlow 2.0版本跨链协议上线,同时支持OKExChain、Heco及BSC双向互操作