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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值