[iOS]事件处理

这篇具有很好参考价值的文章主要介绍了[iOS]事件处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、事件的种类

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

到了这里,关于[iOS]事件处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS 17.0 YYText 崩溃处理

    YYText,发现在iOS 17上运行会崩溃,触发了系统的断言: UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={382, 0}, scale=3.000000, bitmapInfo=0x2002. Use UIGraphicsImageRenderer to avoid this assert. 查了下 api,发现UIGraphicsBeginImageContext在iOS 17上已经deprecated了。 处理办法:YYTextAsyncLayer.m 将

    2024年02月03日
    浏览(35)
  • C++IO流和类型处理(13)

    IO流包括 标准IO流,字符串流,文件流 基础使用 C++预定义的类和函数参考手册:https://zh.cppreference.com/w/cpp 成员函数 C语言的字符串处理库函数 字符指针 ------- char * C++预定义了string类来表示字符串 构造初始化 重载的运算符 成员函数 完善写的mystring类 重载实现 + += == [] = 添加

    2024年02月11日
    浏览(24)
  • iOS 17.0 UIGraphicsBeginImageContextWithOptions 崩溃处理

    在升级到iOS17后你会发现,之前版本运行的很好,这个版本突然会出现一个运行闪退。报错日志为 *** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410 跟踪到具体的报错位置如下所示: UIGraphicsBeginImageContextWithOptions(size, NO , 0); 根据查阅的

    2024年04月11日
    浏览(34)
  • iOS App上架全流程及相关处理

    iOS app上架总体流程: 一、IOS上架整个流程 1、申请开发者账号 2、创建APP ID及申请证书 3、itunes connect 创建APP 4、打包 上传APP 5、提交APP,上线成功 1、申请开发者账号 苹果开发者账号主要分为三种:个人账号、公司账号、企业账号,三种账号年费和权限各不相同。开发者账号

    2024年02月07日
    浏览(37)
  • C#(System.IO)文件处理方法(全面)

    System.IO是C#中用于输入和输出操作的命名空间。它提供了许多类和方法,用于处理文件、文件夹和流的读取和写入操作。以下是一些System.IO命名空间中常用的类和功能: File类: 用于创建、复制、移动、删除和读写文件等操作。它包含一组静态方法,例如Create、Copy、Move、De

    2024年02月10日
    浏览(30)
  • IO流 p5 节点流和处理流

    目录 节点流 和 处理流 一、基本介绍 二、节点流 和 处理流 的区别和联系 三、处理流的功能主要体现在以下两个方面: 四、处理流 — BufferedReader和BufferedWriter 节点流和处理流一览图: ​【图片来源】http://t.csdn.cn/d52a1 节点流: 节点流可以从一个特定的数据源 读写数据 ,

    2024年02月08日
    浏览(24)
  • 微信小程序-处理ios无法播放语音的问题

    框架:taro+vue3 问题:今天搞小程序语音播放功能,开放工具播放正常,但是到ios手机上调试时无法播放,在网上找到个好办法 核心代码 略微完整的代码

    2024年02月15日
    浏览(68)
  • iOS图像处理----OpenGL ES之大长腿特效

    目录  一、代码部分概括 二、实现流程概括   1、第一次加载图片  ①、GLKView初始化数据 这部分内容主要是初始化顶点数组、上下文以及顶点数组缓存区,需要在加载图片之前做好准备​编辑 ②、加载图片  ③、绘制  2、拉伸图片 ①、滑块调整 ②、图片拉伸过程  3、图

    2024年02月19日
    浏览(19)
  • iOS处理json,序列化和反序列化

    Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。 Mantle具有如下特点 自动映射 Mantle自动将 JSON 数据

    2024年02月11日
    浏览(53)
  • XCode15与iOS17/17.1 真机测试问题处理

    XCode15与iOS17/17.1 真机测试问题处理,网上相关博客很多,摘录了如下实践后能起作用的地址如下: Xcode 15 报错处理 - 简书 iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下:Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410 问题处理, 由

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包