关闭

iOS事件分发机制

标签: iosevent响应职责链
143人阅读 评论(0) 收藏 举报
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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1125次
    • 积分:41
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论