iOS响应链和事件的传递
2021-04-12 本文已影响0人
迷失的信徒
UIResponder->响应者对象
UIApplication、UIView、UIViewController、都是继承自UIResponder,CALayer不是UIResponder的子类,所以无法处理事件。
事件的分发和传递
1、当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列。
2、UIApplication将处于任务队列最前端的事件向下分发,即UIWindow。
3、UIWindow将事件向下分发,即UIView。
4、UIView首先会查看自己是否能处理这个事件,触摸点是否在自己的身上;如果能那么就继续寻找子视图。
5、遍历子视图,重复以上步骤。
6、如果能找到,那么自己就是事件的处理者,如果处理不了,就不做处理了。
UIView不接收事件处理的情况
1、
alpha < 0.01
2、userInteractionEnabled = NO
3、hidden = YES
从父控件到子控件寻找处理事件最合适的View的过程,如果父视图不接收事件处理(上面所说的情况),则子视图也不能接收事件。事件只要触摸了就会产生,关键在于是否有最合适的view来处理和接收事件,如果遍历到最后都没有找到合适的view来接收事件,则事件被废弃。
入伙找到最合适的view
// 此方法返回的View是本次点击事件需要的最佳View
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
// 判断一个点是否落在范围内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event