iOS UIResponder事件响应链
iOS UIResponder事件响应链

iOS UIResponder事件响应链

UIResponder 是 iOS 事件响应链的核心类,定义了应用中响应事件(触摸、运动、远程控制、快捷键等)的接口。

它是一个抽象基类,UIView、UIViewController、UIWindow、UIApplication 都继承自 UIResponder。

响应链(responder chain)就是事件从触发点开始,沿着视图控制层级向上传递,直到某个对象处理事件或最终被丢弃。

常用属性

1、next:返回UIResponder?类型,返回响应链中的下一个对象,用于事件传递。

UIView 的 next 通常是它的父视图或 UIViewController。

2、canBecomeFirstResponder:返回Bool类型,默认 false,需要手动 override 返回 true 才能成为第一响应者,接收事件。

3、isFirstResponder:返回Bool类型,当前对象是否是第一响应者。

常用方法

1、触摸事件

这些方法在触摸事件发生时被调用(传入 UITouch 集合和 UIEvent):

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)

touchesBegan:手指刚触摸屏幕

touchesMoved:手指移动

touchesEnded:手指离开屏幕

touchesCancelled:系统中断触摸(如来电话、控制中心)

2、运动事件

用于响应设备运动(摇晃等):

override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
override func motionCancelled(_ motion: UIEvent.EventSubtype, with event: UIEvent?)

3、远程控制事件(如耳机按键)  

override func remoteControlReceived(with event: UIEvent?)

4、快捷键事件(硬件键盘)

override var keyCommands: [UIKeyCommand]? { get }
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?)

5、成为/放弃第一响应者

func becomeFirstResponder() -> Bool
func resignFirstResponder() -> Bool

6、通知事件

func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) // 触摸属性更新

响应链工作原理

1、用户触摸屏幕,系统生成 UIEvent。

2、事件首先发给触摸点对应的 UIView。

3、UIView 如果没处理(或调用 super),事件沿着 next 属性传递到父视图、UIViewController,最终到 UIWindow,甚至 UIApplication。

4、响应链中任何对象可以拦截或处理事件。

总结

UIResponder 是事件响应链的基类。

响应链机制保证事件可以层层传递,不同对象可以选择处理或忽略。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注