当前位置:   article > 正文

[iOS]事件处理

[iOS]事件处理

一、事件的种类

1.触摸事件(Touch Events)

触摸事件是最为直观的用户交互形式。iOS 设备的触摸屏能够检测多点触摸,并区分各种手势。处理触摸事件的关键在于理解 UIResponder 类以及其相关的方法。下面是一些更详细的信息:

  • UIResponder: 所有能够响应用户事件的对象,比如视图(UIView)和视图控制器(UIViewController),都是 UIResponder 的子类。这个类定义了处理触摸事件的方法(如 touchesBegan:withEvent:)。

  • UITouch: 表示触摸屏幕的手指。一个 UITouch 对象包含了触摸事件的许多相关信息,包括触摸的位置、触摸阶段(开始、移动、结束、取消)等。

  • UIEvent: 代表了一系列从用户输入开始到结束的触摸。一个 UIEvent 对象可以包含多个 UITouch 对象,表示多点触摸。

处理触摸事件的典型步骤:

  1. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  2.     // 处理触摸开始事件
  3. }
  4. override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
  5.     // 处理触摸移动事件
  6. }
  7. override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
  8.     // 处理触摸结束事件
  9. }
  10. override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
  11.     // 处理触摸取消事件
  12. }

2.运动事件(Motion Events)

除了触摸屏幕,iOS 设备还能够检测和响应设备本身的运动,比如摇晃。这些运动事件也是通过 UIResponder 类来处理的。要使应用程序能够接收到运动事件,你需要重写以下方法:

  1. override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
  2.     // 处理运动开始
  3. }
  4. override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
  5.     // 处理运动结束
  6. }
  7. override func motionCancelled(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
  8.     // 处理运动取消
  9. }

3.远程控制事件(Remote Control Events)

远程控制事件允许 iOS 设备响应来自外部配件的命令,比如耳机。为了处理这些事件,你的应用程序必须成为第一响应者。一旦你的应用程序开始接收远程控制事件,它就可以重写以下方法来响应:

  1. override func remoteControlReceived(with event: UIEvent?) {
  2.     // 检查事件的类型是否为远程控制
  3.     if let event = event, event.type == .remoteControl {
  4.         switch event.subtype {
  5.         case .remoteControlPlay:
  6.             // 处理播放命令
  7.         case .remoteControlPause:
  8.             // 处理暂停命令
  9.         // 处理其他命令...
  10.         default:
  11.             break
  12.         }
  13.     }
  14. }

二、事件的传递流程

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对象也不处理该事件,那么这个事件就会被系统丢弃。

任何响应者都可以选择不处理事件,将其传递给下一个响应者,或者选择处理事件并阻止其进一步传递。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/406634
推荐阅读
相关标签
  

闽ICP备14008679号