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.
本文重点介绍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