简单概述iOS响应链和事件传递

文章末尾有两个开发中经常遇到问题的例子,不要错过哟~

前提:

UIView不接受事件处理的情况主要有以下三种
1、alpha <0.01
2、userInteractionEnabled = NO
3、hidden = YES

过程:

当我们点击View D的位置时:系统调用 hitTest:withEvent: 方法寻找更合适的view,如果子控件是合适的view,则在子控件再调用hitTest:withEvent:查看子控件是不是合适的view,一直遍历,直到找到最合适的view。过程如下:

1.触摸的CGPoint在View A上吗?在的,继续测试A的子视图View B、View C
2.在View B上吗?不。在View C上吗?在,继续C的子视图View D、View E
3.在View D上吗?不,且D无subview,结束此分支
4.在View E上吗?在,E无subview,结束此分支
5.结果形成了一个链,View A -->View C -->View E

当View E无法处理此事件怎么办?按照响应链往上回溯即可,一直回溯到application,也无人处理此事件,则将事件【丢弃】。

注意:所有的响应链都是父子视图的关系,如果View A、View C、 VIew E只是视觉上遮盖了,但是却不是superview、subview的关系,则事件是不会在两者之间传递的

事件处理两个例子:

如图:
1、如果b的userInteractionEnabled为NO,给a添加UITapGestureRecognizer点击事件,点击b会响应a的点击事件吗?
会。因为点击b发生触摸事件时,系统会从父控件进行遍历。因为a添加了点击事件,且b的userInteractionEnabled为NO,不接受事件处理。则系统认为a是适合处理事件的view。

2、如果a的userInteractionEnabled为NO,给b添加UITapGestureRecognizer点击事件,点击b会响应自己的点击事件吗?
不会。因为点击b发生触摸事件时,系统会从父控件进行遍历。作为b的父控件,如果a的userInteractionEnabled为NO,a不接受事件处理,则无法传递到b,所以b不响应

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先要先学习下响应者对象UIResponder,只有继承UIResponder的的类,才能处理事件。 我们可以看出...
    tanghaiyang阅读 344评论 0 1
  • 不知道大家有木有经历过,创建一个按钮在Cell上,但是很多人反馈,点击不了,一点击就走了UITableView的d...
    BabyNeedCare阅读 359评论 0 0
  • 前言   在日常的开发过程我们经常遇到子视图在父视图外面点击无响应的情况,我们通常用hitTest:withEve...
    Hedgehog___阅读 2,426评论 0 11
  • 前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的vi...
    小虫笔墨阅读 1,113评论 0 14
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,590评论 16 22