文章末尾有两个开发中经常遇到问题的例子,不要错过哟~
前提:
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不响应
网友评论