iOS-面试iOS基本功

iOS 事件机制 -- 从触发到响应

2019-08-05  本文已影响0人  那时J花开

当手指触摸到屏幕时, 一个触摸事件就在系统中产生了.通过进程间通信(IPC), 最终传递给合适的应用,并找到应用中的最佳响应者进行响应. 整个流程大概如下:

事件响应链.png
1. 系统响应阶段

mach port 进程端口,各进程之间通过它进行通信。
SpringBoad.app 是一个系统进程,可以理解为桌面系统,可以统一管理和分发系统接收到的触摸事件。

2. Hit-Testing
// recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;

// default returns YES if point is in bounds
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;

前者会通过recursively calls递归调用来返回一个适合响应触摸事件的UIView对象:

hitTest

如果通过demo来验证Hit-Testing, 会发现, 其实整个Hit-Testing过程会发生两次. 对此苹果官方有相应的回复:

Yes, it’s normal. The system may tweak the point being hit tested between the calls. Since hitTest should be a pure function with no side-effects, this should be fine.

3. Responder Chain

通过Hit-Testing找到的视图拥有最先对触摸事件进行响应的机会. 如果这个视图无法处理触摸事件, 就会沿着Responder Chain向上进行传递.直到找到可以处理事件的视图, 或者一直到UIApplication都没有能够处理, 该事件就会被废弃掉. 若runloop无其他事件, 则进入休眠, 等待下一个事件到来.

上一篇下一篇

猜你喜欢

热点阅读