[iOS]事件处理

news/2024/5/4 1:51:41/文章来源:https://blog.csdn.net/u012881779/article/details/137474806

一、事件的种类

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1046087.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java下载网络上的文件、图片保存到本地 FileUtils

java下载网络上的文件、图片保存到本地 FileUtils 1. 引入FileUtils依赖2. 实现代码3. 输出结果 1. 引入FileUtils依赖 <!--FileUtils依赖--> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io&l…

【vue】watch监听取不到this指向的数?

今天同事问我&#xff0c;watch里this指向的数值&#xff0c;别的地方却可以打印出来。工具也能看到数值&#xff0c;但打印出来却是undifined&#xff0c;先看看代码&#xff1a; 懒得打字了直接上截图吧 ps&#xff1a; 在Vue组件中&#xff0c;如果你在watch选项中访问this…

PyCharm+PyQt5配置方法

一、前言 PyQt5PyQt5是一套Python绑定Digia QT5应用的框架。Qt库是最强大的GUI库之一PyQt5-toolsPyQt5中没有提供常用的Qt工具&#xff0c;比如图形界面开发工具Qt Designer&#xff0c;PyQt5-tools中包含了一系列常用工具Qt Designer可以通过Qt Designer来编写UI界面&#xf…

钉钉与金蝶云星空对接集成获取流程实例(宜搭)打通收款退款新增

钉钉与金蝶云星空对接集成获取流程实例&#xff08;宜搭&#xff09;打通收款退款新增 接入系统&#xff1a;钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台&#xff0c;提供PC版&#xff0c;Web版和手机版&#xff0c;有…

设计模式总结-组合模式

组合设计模式 模式动机模式定义模式结构组合模式实例与解析实例一&#xff1a;水果盘实例二&#xff1a;文件浏览 更复杂的组合总结 模式动机 对于树形结构&#xff0c;当容器对象&#xff08;如文件夹&#xff09;的某一个方法被调用时&#xff0c;将遍历整个树形结构&#x…

李沐26_网络中的网络NiN——自学笔记

全连接层太大 导致占用内存、占用计算带宽、很容易过拟合 NiN块 1.一个卷积层后跟着两个全连接层 2.步幅1&#xff0c;无填充&#xff0c;输出形状跟卷积层输出一样 3.起到全连接层的作用 NiN架构 1.无全连接层 2.交替使用NiN块和步幅为2的最大池化层&#xff0c;逐步减…

Weblogic任意文件上传漏洞(CVE-2018-2894)漏洞复现(基于vulhub)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

【算法】双指针算法

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 283. 移动零1.1 分析1.2 代码 2. 1089. 复写零2.1 分析2.2 代码 3. 202. 快乐数3.1 分析3.2 代码 4. 11. 盛最多水的容器4.1 分析4.2 代码 5. LCR 179. 查找总价格为目标值的两个商品5.1 分析5.2 代码 6. 15. 三数之和…

antd vue table控件的使用(三)

今天就讲讲Ant Design Vue下的控件----table表格&#xff08;分页、编辑和删除功能&#xff09; 结合项目中的需求&#xff0c;看看如何配置,让table即可以展示列表&#xff0c;又可以直接编辑数据。需求&#xff1a; &#xff08;1&#xff09;展示即将检查的数据列表&#…

持续交付工具Argo CD的部署使用

Background CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发流程&#xff0c;旨在通过自动化和持续集成的方式提高软件交付的效率和质量。它包括持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;两个主要阶…

Day5-Hive的结构和优化、数据文件存储格式

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

怎么保证缓存与数据库的最终一致性?

目录 零.读数据的标准操作 一.Cache aside Patten--旁路模式 二.Read/Write Through Pattern--读写穿透 三.Write Back Pattern--写回 四.运用canal监听mysql的binlog实现缓存同步 零.读数据的标准操作 这里想说的是不管哪种模式读操作都是一样的&#xff0c;这是一种统一…

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

Unity之Unity面试题(五)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之Unity面试题&#xff08;五&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取…

目标检测——RCNN系列学习(二)Faster RCNN

接着上一篇文章&#xff1a;目标检测——RCNN系列学习(一&#xff09;-CSDN博客 主要内容包含&#xff1a;Faster RCNN 废话不多说。 Faster RCNN [1506.01497] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (arxiv.org)https://arxiv.…

跨域问题一文解决

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 一、为什么会出现跨域的问题&#xff1f; 是浏览器的同源策略&#xff0c;跨域也是因为浏览器这个机制引起的&#xff0c;这个机制的存在还是在于安全…

Netty 入门应用之Http服务WebSocket

Netty实现Http服务 主要的变化是在初始化器中引入了新的编解码器 一些创建的类作用和Netty HelloWorld的小demo一样我这里就不再次重复了 1、Http服务端代码 public class HttpServer {public static void main(String[] args) {// 创建Reactor// 用来管理channel 监听事件 …

力扣HOT100 - 238. 除自身以外数组的乘积

解题思路&#xff1a; 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积。因此需要进行两次遍历&#xff0c;第一次遍历用于求左部分的乘积&#xff0c;第二次遍历在求右部分的乘积的同时&#xff0c;再将最后的计算结果一起求出来。 class Solution {public int[] prod…

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…