iOS事件分发机制

iOS事件主要有两种:Touch Event, Motion Event.
本文重点介绍Touch事件.


首先,UIKit感知用户点击操作,生成UIEvent并将其加入到Active App的Event Queue中.
UIApplication从Event Queue中取出事件,并将其投递给UIWindow.
UIWidow根据Event的Point,尝试确定点击操作具体是在哪个View上发生的(Hit-Testing),具体方法为:
递归判断subView,直到找到Touch事件所在的最上层View.该View是处理Event的initial object.


接下来的处理流程,是以职责链(The Responder Chain)的方式实现的:
链上的每一个对象,都是事件处理者.如果对象没有实现对应的方法去捕获事件,事件将自动传递给下一位响应者.


iOS中能够处理事件的类,均从UIResponder派生.其中nextResponder属性,指明下一响应者.
具体到Touch事件,其职责链是按以下方式实现的:
1.UIView有Controller时,nextResponder是其Controller.
没有Controller时,nextResponder是其SuperView.
2.Controller的nextResponder,是其view的SuperView.
3.UIWindow的nextResponder,是UIApplication.
4.UIApplication的nextResponder,是nil.




由此可见,职责链基本是按照View Hierarchy路由.当前View不处理,传递给SuperView.(如果view直接隶属于Controller,会先交给Controller处理,再交给其SuperView).
而UIWindow是View Hierarchy的Root View,Event传递到他手里以后,它会转手给UIApplication.

而UIApplication会直接将收到的Event直接丢弃,故其nextResponder为nil.


最后,附官方文档:

https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html

阅读更多
上一篇如何招聘研发人员
下一篇谈谈iOS延迟调用--对比NSTimer、performSelector和dispatch_after
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭