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 是事件响应链的基类。
响应链机制保证事件可以层层传递,不同对象可以选择处理或忽略。
