iOS事件形成、传递和响应

事件的形成

    1、iPhone 采用电容触摸传感器和人体交互,在手指触摸时可形成耦合电容

    2、触摸屏屏幕四角上存在电极,电流从四角流出到手指触摸点,存在与距离成正比的电流差,从而精确计算触摸点到屏幕的距离

事件的传递

事件到系统

    1、iOS操作系统进程之间采用消息发送的方式通信,即IPC(Inter-Process Communication)

    2、Mach Port机制:用户进程调用内核进程的通信机制,先向内核申请访问端口,然后再向该端口发送消息

    3、用户触摸屏幕形成点击事件,通过IOKit.framework包装成IOHIDEvent对象,通过消息发送方式传递给苹果系统应用层SpringBoard.app,它接收消息后做进一步分发处理,判断当前是否存在活跃应用程序,通过Mach Port机制传递给当前应用的主进程,否则...

系统到应用

    1、应用程序主线程申请了MachPort,通过__IOHIDEventSystemClientQueueCallback()系统方法回调监听IOHIDEvent事件

    2、通过使用__UIApplicationHandleEventQueue()方法将监听到的IOHIDEvent对象包装成UIEvent对象,并通过sendEvent:函数发送给UIWindow(keyWindow),做一些判断逻辑,选取事件最终执行者。

寻找最终执行者(Hit-Testing)

    1、事件的传递自下而上,层层递进 iOS system -> UIApplication -> UIWindow -> UIViewController ->UIView

    2、屏幕最上层的视图有更高的执行优先级

    3、父视图无执行能力,则子视图也无法执行,若父视图有执行能力则要判断它的子视图

    4、寻找最终执行者的过程中, UIEvent对象中的UITouch会不断打上标签(当前可执行者,父视图,执行事件类型)

    5、判断当前试图是否可执行事件的前置条件(有和用户交互能力、没有被隐藏、透明度大于0.01)

    6、判断当前试图是否可执行事件的方法 hitTest:withEvent

事件的执行

    1、事件除了被最终执行者消耗,还能被手势识别器或是 target-action 模式捕获并消耗。

    2、当事件没有被当前执行者消耗掉

    3、control类型控件,不管是否去执行事件,事件都会被消耗掉

    4、所有执行者都派生自UIResponder类,本身存在执行事件的能力,默认实现 touchesBegin touchesMove touchesEnded touchesCancelled四个方法

你可能感兴趣的:(iOS事件形成、传递和响应)