一、事件的种类
1.触摸事件(Touch Events)
触摸事件是最为直观的用户交互形式。iOS 设备的触摸屏能够检测多点触摸,并区分各种手势。处理触摸事件的关键在于理解 UIResponder 类以及其相关的方法。下面是一些更详细的信息:
-
UIResponder: 所有能够响应用户事件的对象,比如视图(UIView)和视图控制器(UIViewController),都是 UIResponder 的子类。这个类定义了处理触摸事件的方法(如 touchesBegan:withEvent:)。
-
UITouch: 表示触摸屏幕的手指。一个 UITouch 对象包含了触摸事件的许多相关信息,包括触摸的位置、触摸阶段(开始、移动、结束、取消)等。
-
UIEvent: 代表了一系列从用户输入开始到结束的触摸。一个 UIEvent 对象可以包含多个 UITouch 对象,表示多点触摸。
处理触摸事件的典型步骤:
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?) {
// 处理触摸取消事件
}
2.运动事件(Motion Events)
除了触摸屏幕,iOS 设备还能够检测和响应设备本身的运动,比如摇晃。这些运动事件也是通过 UIResponder 类来处理的。要使应用程序能够接收到运动事件,你需要重写以下方法:
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.远程控制事件(Remote Control Events)
远程控制事件允许 iOS 设备响应来自外部配件的命令,比如耳机。为了处理这些事件,你的应用程序必须成为第一响应者。一旦你的应用程序开始接收远程控制事件,它就可以重写以下方法来响应:
override func remoteControlReceived(with event: UIEvent?) {
// 检查事件的类型是否为远程控制
if let event = event, event.type == .remoteControl {
switch event.subtype {
case .remoteControlPlay:
// 处理播放命令
case .remoteControlPause:
// 处理暂停命令
// 处理其他命令...
default:
break
}
}
}
二、事件的传递流程
1.事件传递链(Event Passing Chain)
事件传递链是用于确定哪个视图应接收触摸事件的过程。
当用户在设备屏幕上进行触摸时,iOS会生成一个触摸事件并将其传送给应用程序。
事件传递链的主要步骤如下:
(1).触摸事件生成
用户的触摸动作会被系统捕获并创建成UITouch对象,然后这些UITouch对象被打包到一个UIEvent对象中。
(2).命中测试(Hit-Testing)
传递链的开始是窗口(UIWindow)对象的命中测试。UIWindow对象将UIEvent对象传递给其根视图。
根视图及其子视图通过hitTest:withEvent:方法递归执行命中测试,以确定哪个视图的边界内包含了触摸点。这个过程会继续深入视图层级,直到找到最具体的子视图,即命中视图。
(3).事件传递
一旦确定了命中视图,事件就会被传递给这个视图。如果这个视图是UIResponder的实例(所有的UIView都是),它将有机会处理这个事件。
2.响应者链(Responder Chain)
响应者链是一系列的UIResponder对象,它定义了如何传递和处理不同的事件,包括触摸事件。UIResponder是一个抽象类,定义了处理事件的接口。UIView、UIViewController、UIWindow和UIApplication都是UIResponder的子类,可以处理事件。
当一个视图接收到一个事件,但不处理它时,事件会沿着响应者链向上传递,直到找到一个可以处理该事件的对象。
响应者链的主要步骤如下:
(1).视图响应
当一个视图通过命中测试接收到一个事件时,它有机会通过重写UIResponder的方法来响应事件,例如touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:和touchesCancelled:withEvent:。
(2).传递到视图控制器
如果视图不处理事件(没有重写相应的方法或者方法中调用了super),事件将被传递给视图的视图控制器(如果有的话)。
(3).父视图传递
如果视图控制器也不处理事件,事件将传递给视图的父视图。
(4).窗口传递
如果事件继续未被处理,它将被传递到最顶层的UIWindow对象。
(5).应用程序对象
如果连UIWindow也不处理该事件,事件最终会传递到UIApplication对象,这是响应者链的最后一个环节。
(6).事件最终处理
如果UIApplication对象也不处理该事件,那么这个事件就会被系统丢弃。文章来源:https://www.toymoban.com/news/detail-847096.html
任何响应者都可以选择不处理事件,将其传递给下一个响应者,或者选择处理事件并阻止其进一步传递。文章来源地址https://www.toymoban.com/news/detail-847096.html
到了这里,关于[iOS]事件处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!