要理解这两个方法。先了解一下用户触摸屏幕后的事件传递过程。

当用户点击屏幕后,UIApplication 先响应事件,然后传递给UIWindow。如果window可以响应。就开始遍历window的subviews。遍历的过程中,如果第一个遍历的view1可以响应,那就遍历这个view1的subviews(依次这样不停地查找,直至查找到合适的响应事件view)。如果view1不可以响应,那就开始对view2进行判断和子视图的遍历。依次类推view3,view4……  如果最后没有找到合适的响应view,这个消息就会被抛弃。(整个遍历的过程就是树的先序遍历)。过程如下图:

理解了上面的图后,我们再来看看这两个方法。

为了方便,我们将

- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event;称为方法A

- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;称为方法B

对view进行重写这两个方法后,就会发现,点击屏幕后,首先响应的是方法A;

如果方法A中,我们没有调用父类的这个方法,那就根据这个方法A的返回view,作为响应事件的view。(当然返回nil,就是这个view不响应)

如果方法A中,我们调用了父类的这个方法,也就是

[super hitTest:point withEvent:event];那这个时候系统就要调用方法B;通过这个方法的返回值,来判断当前这个view能不能响应消息。

如果方法B返回的是no,那就不用再去遍历它的子视图。方法A返回的view就是可以响应事件的view。

如果方法B返回的是YES,那就去遍历它的子视图。(就是上图我们描述的那样,找到合适的view返回,如果找不到,那就由方法A返回的view去响应这个事件。)

因此总结下来:

//返回一个view来响应事件 (我们如果不想影响系统的事件传递链,在这个方法内,最好调用父类的这个方法)

- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event;

//返回的值可以用来判断是否继续遍历子视图(返回的根据是触摸的point是否在view的frame范围内)

- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;

最新文章

  1. 元素绝对居中终极办法兼容IE8
  2. MySql的一些操作
  3. (转)linux命令行下的ftp 多文件下载和目录下载
  4. 牛客网上的剑指offer题目
  5. C语言单链表实现19个功能完全详解
  6. java时间比较
  7. CSS权威指南学习笔记 —— 初步认识CSS
  8. Hibernate学习笔记(1)Hibernate构造
  9. Hadoop-MyEclipse安装配置
  10. js绘制圆形时钟
  11. servlet类
  12. Kafka设计解析(四)Kafka Consumer设计解析
  13. Decorator 装饰
  14. 接口传值实例DatePickerDialog
  15. MUI框架-07-HBuilder+夜神安卓模拟器
  16. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:
  17. Linux 用C语言判断文件和文件夹
  18. Elastic Load Balancing with Sticky Sessions
  19. Node.js Mongoose数据库连接失败 提示:Authentication failed
  20. python进阶——进程/线程/协程

热门文章

  1. 2018.7.2 如何用js实现点击图片切换为另一图片,再次点击恢复到原图片
  2. SqlServer2000事件探测器的使用
  3. Drupal7新装一个主题时页面白屏,如何设置一个默认主题?
  4. .NET中变量生存期
  5. Mysql--数据操作语言(DML)
  6. 安装配置mysql图文步骤以及配置mysql的环境变量的步骤
  7. 基于flash-marker.js 的地图标注闪烁代码调试
  8. 从Mixin到hooks,谈谈对React16.7.0-alpha中即将引入的hooks的理解
  9. thinkcmf5 学习笔记
  10. .net core IdentityServer4 使用query参数