【iOS】事件响应链

iOS中的事件类型

  • 点击事件(Touch Event)
  • 运动事件 (Motion Event)
  • 远程控制事件 (Remote Control Event)

响应者对象

定义:能够接收和处理事件的对象。

在iOS中,所有的响应者对象都是继承自UIResponder类的实例,常见的子类包括:UIApplication、UIView和UIViewController。UIKit会自动管理响应者相关的行为。

这里写图片描述


响应链

当任何事件发生时,系统首先询问当前的第一响应者。在iOS中,任何UIResponder类的子类都能称为第一响应者。UIKit会为每个事件指派第一响应者,首先把事件传给第一响应者。第一响应者因事件的类型而变化。

  • Touch Event:第一响应者是点击事件发生的视图。
  • Press events:第一响应者是焦点所在的响应者。
  • Motion events:第一响应者是你指定的用来处理事件的对象。该事件不遵循响应者链。
  • Shake-motion events:第一响应者是你(或UIKit)指定的作为第一响应者的对象。
  • Remote-control events:第一响应者是你(或UIKit)指定的作为第一响应者的对象。
  • Editing-menu messages:第一响应者是你(或UIKit)指定的作为第一响应者的对象。

如果第一响应者不能处理事件,事件就会继续传递下去,被下一个Responder接收,如果下一个responder也不处理,又会被下下个responder接收…直到一个responder处理了事件或者没有responder了。这些responder按照传递次序连接起来的链条就构成了响应链

这里写图片描述

苹果解释了沿着链条访问的历程:

  • UIView
    • 如果view是一个view controller的根视图,那么这个view的next responder就是该view controller。
    • 如果view不是一个view controller的根视图,那么这个view的next responder就是该view的superview。
  • UIViewController
    • 如果view controller的view是一个窗口(window)的根视图,那么next responder就是window对象。
    • 如果view controller是被其它view controller展现的,那么next responder就是展现它的view controller。
  • UIWindow
    window的next responder是application对象。
  • UIApplication
    应用程序对象的next responder是应用程序的代回调(delegate),但是只有应用程序对象的回调是UIResponder实例时候。(从iOS5开始,应用程序委托继承自UIResponder,而不在像之前那样继承自NSObject)

响应链是由近及远进行传递。


Hit-Testing View

当事件发生时,会通过硬件驱动传递到Core层,在传递到应用层,若是基于UI的应用程序,在传递给UIApplication,通过sendEvent方法传递给keyWindow,在传到UIView,UIView需要判断userInteractionEnabled,然后做hitTest。

这里写图片描述

响应事件的具体响应者,我们称之为:Hit-Testing View,寻找Hit-Testing View的过程我们称之为:Hit-Test。

这里写图片描述


Hit-Test是一个由远及近的过程。

使用场景

  • 增加视图响应热区
  • 指定处理事件的视图

参考资料

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值