响应者链(Responder Chain)

什么是响应者链:

对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。对应的事件类型有以下三种:
触屏事件 (Touch Event)
运动事件 (Motion Event)
远端控制事件 (Remote-Control Event)

响应者链有以下特点:

响应者链通常是由视图(UIView)构成的;
一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话),然后再转给它的父视图(Super View);
视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图;
单例的窗口(UIWindow)的内容视图将指向窗口本身作为它的下一个响应者需要指出的是, Cocoa Touch 应用不像 Cocoa 应用,它只有一个 UIWindow 对象,因此整个响应者链要简单一点;
单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向 nil,以结束整个循环。
点击屏幕时是如何互动的

iOS 系统检测到手指触摸 (Touch) 操作时会将其打包成一个UIEvent对象,并放入当前活动 Application 的事件队列,单例的 UIApplication 会从事件队列中取出触摸事件并传递给单例的 UIWindow 来处理, UIWindow 对象首先会使用 hitTest:withEvent: 方法寻找此次 Touch 操作初始点所在的视图 (View) ,即需要将触摸事件传递给其处理的视图,这个过程称之为 hit-test view 。
UIWindow 实例对象会首先在它的内容视图上调用hitTest:withEvent: ,此方法会在其视图层级结构中的每个视图上调用 pointInside:withEvent: (该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果 pointInside:withEvent: 返回 YES ,则继续逐级调用,直到找到 touch 操作发生的位置,这个视图也就是要找的 hit-test view 。
hitTest:withEvent: 方法的处理流程如下:首先调用当前视图的 pointInside:withEvent: 方法判断触摸点是否在当前视图内;若返回 NO ,则 hitTest:withEvent: 返回 nil ;若返回 YES , 则向当前视图的所有子视图 (subviews) 发送 hitTest:withEvent: 消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从 subviews 数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;若第一次有子视图返回非空对象,则 hitTest:withEvent: 方法返回此对象,处理结束;如所有子视图都返回非,则 hitTest:withEvent: 方法返回自身 (self) 。
事件的传递和响应分两个链:

传递链:由系统向离用户最近的view传递。UIKit –> active app’s event queue –> window –> root view –>……–>lowest view
响应链:由离用户最近的view向系统传递。initial view –> super view –> …..–> view controller –> window –> Application

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值