赞
踩
触摸事件是最为直观的用户交互形式。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?) {
- // 处理触摸取消事件
- }
除了触摸屏幕,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?) {
- // 处理运动取消
- }
远程控制事件允许 iOS 设备响应来自外部配件的命令,比如耳机。为了处理这些事件,你的应用程序必须成为第一响应者。一旦你的应用程序开始接收远程控制事件,它就可以重写以下方法来响应:
- override func remoteControlReceived(with event: UIEvent?) {
- // 检查事件的类型是否为远程控制
- if let event = event, event.type == .remoteControl {
- switch event.subtype {
- case .remoteControlPlay:
- // 处理播放命令
- case .remoteControlPause:
- // 处理暂停命令
- // 处理其他命令...
- default:
- break
- }
- }
- }
事件传递链是用于确定哪个视图应接收触摸事件的过程。
当用户在设备屏幕上进行触摸时,iOS会生成一个触摸事件并将其传送给应用程序。
事件传递链的主要步骤如下:
用户的触摸动作会被系统捕获并创建成UITouch对象,然后这些UITouch对象被打包到一个UIEvent对象中。
传递链的开始是窗口(UIWindow)对象的命中测试。UIWindow对象将UIEvent对象传递给其根视图。
根视图及其子视图通过hitTest:withEvent:方法递归执行命中测试,以确定哪个视图的边界内包含了触摸点。这个过程会继续深入视图层级,直到找到最具体的子视图,即命中视图。
一旦确定了命中视图,事件就会被传递给这个视图。如果这个视图是UIResponder的实例(所有的UIView都是),它将有机会处理这个事件。
响应者链是一系列的UIResponder对象,它定义了如何传递和处理不同的事件,包括触摸事件。UIResponder是一个抽象类,定义了处理事件的接口。UIView、UIViewController、UIWindow和UIApplication都是UIResponder的子类,可以处理事件。
当一个视图接收到一个事件,但不处理它时,事件会沿着响应者链向上传递,直到找到一个可以处理该事件的对象。
响应者链的主要步骤如下:
当一个视图通过命中测试接收到一个事件时,它有机会通过重写UIResponder的方法来响应事件,例如touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:和touchesCancelled:withEvent:。
如果视图不处理事件(没有重写相应的方法或者方法中调用了super),事件将被传递给视图的视图控制器(如果有的话)。
如果视图控制器也不处理事件,事件将传递给视图的父视图。
如果事件继续未被处理,它将被传递到最顶层的UIWindow对象。
如果连UIWindow也不处理该事件,事件最终会传递到UIApplication对象,这是响应者链的最后一个环节。
如果UIApplication对象也不处理该事件,那么这个事件就会被系统丢弃。
任何响应者都可以选择不处理事件,将其传递给下一个响应者,或者选择处理事件并阻止其进一步传递。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。