【iOS】—— 事件传递链和响应者链总结

news2024/9/23 11:24:59

事件传递链和响应者链总结

      • 1. 事件传递链:
        • 事件传递链:
        • 传递流程:
        • 总结第一响应者:
      • 2. 响应者链
        • 响应者链
        • 传递流程
        • 总结响应者链流程
      • 总结:

之前也学习过这个内容这次在复习的时候,就想着写一下总结:
初始事件传递链和响应者链

1. 事件传递链:

事件传递链:

将用户在应用程序中的进行交互的事件发送到视图层次中的适当对象。在这个事件的传递过程中,从根视图开始查找,并递归向下查找最合适的处理该事件的视图(第一响应者)。

传递流程:
  • 事件产生: 用户通过与设备交互生成事件,系统将事件传递给引用的UIApplication实例,以开始事件分发。
  • UIApplication事件分发:UIApplication实例将事件传递给当前的UIWindow对象,进一步查找适合的响应者。
  • UIWindow事件分发:当前UIWindow通过调用hitTest:withEvent:方法来遍历整个视图层次结构,找到合适的视图来响应工作。
  • 命中测试(hitTest:withEvent:)
    **hitTest:withEvent:是寻找第一响应者的核心方法。**它通过以下步骤工作:
    1. 检查当前视图的属性隐藏hidden = NO,交互userInteractionEnabled=YES、透明度alpha>0.01三者都满足才能拥有响应的能力。
    2. 调用pointInside:withEvent:,确定触摸点是否在当前视图的边界范围内。
    3. 从后往前遍历子视图,递归调用子视图的hitTest:withEvent:方法。
    4. 直到找到合适的子视图,返回子视图作为第一响应者,否则返回当前视图本身。
  • 第一响应者确定:如果确定了当前触摸点在当前视图上,同时当前视图没有任何子视图,那么当前视图就成为第一响应者并开始处理触摸事件。

相应的大致流程过程:UIKit –> active app's event queue –> window –> root view –> …… –> lowest view
事件传递的本质就是为了让我们找到第一响应者。

总结第一响应者:
  1. 能够响应触摸事件
  2. 触摸点在自己的边界范围内
  3. 没有任何子视图或者所有子视图都不在触摸点上。
    在这里插入图片描述

2. 响应者链

响应者链

在事件传递链中找到了第一响应者,但是第一响应者不一定可以响应事件,因为他可能没有实现触摸事件。

传递流程

对于响应者链的传递流程可以通过下面这张图来看:
在这里插入图片描述
左边的app响应者链:

  1. 初始视图对象尝试对事件进行处理,如果无法处理,就将事件传递给父视图对象。在视图树,初始视图并不是最顶端的视图。
  2. 父视图也会进行同样的尝试,因为相同的原因,只能将事件继续向上传递。
  3. 视图控制器中最顶层的视图也进行相同的尝试,结果处理不了就会传递给视图控制器。
  4. 视图控制器也一样无法处理,于是继续向上传递给主窗体对象(window)。
  5. 主窗体也无法处理,就会继续传给app的单例实体对象。
  6. 最后单例实体对象没有处理,就会将事件丢弃掉。

右边的app响应者链:

  1. 视图将事件沿着视图控制器的视图树向上传递,直到最顶端的视图。
  2. 顶端的视图无法处理就直接交给视图控制器。
  3. 视图控制器无法处理就将事件传递给其顶端视图所在的父视图,重复1~3,知道到达最顶端的跟视图控制器。
  4. 跟视图控制器将事件传递给主窗体对象。
  5. 主窗体对象传递给app的单例实体对象。
总结响应者链流程

判断当前视图能否响应,再去判断当前视图的nextResponder,如果是VCView,那么nextResponer就是VC

如果不是控制器的View,上一个响应者就是SuperView

相应的大致流程过程:第一响应者->super view->......->ViewController->window->application

总结:

  • 触摸事件发生之后,系统会生成简单的UIEvent
  • UIEvent产生的事件添加到UIApplication队列中。
  • 然后UIApplication将事件分发给UIWindow,主窗口会在视图层次中找到合适的视图处理触摸事件。
  • 不但递归调用hitTest方法来确定第一响应者。
  • 如果第一响应者无法响应事件,就按照响应者链往上传递,传递给父视图。
  • 一直传到UIApplication,如果都没有响应则事件丢弃。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux部署python3.0版本——及基本操作

(一)部署环境 首先查看列表,找到python3.0的包 yum list installed|grep python 如果没有,是因为yum源的问题,可部署阿里云镜像然后下载epel包,这里的内容可参考前面的阿里云镜像部署 然后进行下载 yum…

TensorRT-LLM中的 Quantization GEMM(Ampere Mixed GEMM)的 CUTLASS 2.x 实现讲解

在LLM的推理和部署中,低精度量化对于性能的提升十分关键,本次分享将为大家介绍TRT-LLM中是如何基于CUTLASS 2.x来实现PerChannel/AWQ/SmoothQuant等量化方法在模型推理过程的计算。Slides来自BiliBili NVIDIA英伟达频道 上传的《TensorRT-LLM中的 Quanti…

最新CSS3伪类和伪元素详解

第4章 伪类和伪元素 4.1结构伪类 E:first-child{},第一个元素 样式&#xff1a; p:first-child {color: red; } <div><p>Lorem ipsum</p><p>Dolor sit amet.</p> </div> 4.1.1nth-*伪类 以计数为基础的&#xff0c;默认情况下&…

某赛通电子文档安全管理系统 CDGAuthoriseTempletService1 SQL注入漏洞复现(XVE-2024-19611)

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

RPA在政务服务中的挑战与解决方案

随着数字化时代的到来&#xff0c;数字政务的建设已成必然趋势&#xff0c;RPA作为数字化转型的重要工具之一&#xff0c;能够帮助政府单位快速实现业务流程的自动化和智能化&#xff0c;提高工作效率和质量&#xff0c;为建设数字政务提供强有力的支持&#xff0c;因此正被越来…

深植根基、蓬勃向上 | openKylin 2.0正式发布!

2024年8月8日&#xff0c;openKylin 2.0版本正式发布&#xff01;该版本默认搭载Linux 6.6 LTS内核&#xff0c;完成180操作系统核心组件自主选型升级&#xff0c;深度融合AI技术&#xff0c;上线麒麟AI助手等实用AI功能&#xff0c;并为用户带来包括开明软件包格式、不可变系统…

Unity 在Editor下保存对Text组件的文本的修改

Unity 在Editor下保存对Text组件的文本的修改 /****************************************************文件&#xff1a;TimeStampForText.cs作者&#xff1a;lenovo邮箱: 日期&#xff1a;2024/8/8 1:9:21功能&#xff1a; *************************************************…

聚观早报 | 小米15 Ultra相机规格;一加Ace 5参数规格

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 8月8日消息 小米15 Ultra相机规格 一加Ace 5参数规格 iOS 18.1代码曝光 SK电讯加大AI投入 Figure 02 人形机器人…

【VScode】如何在anaconda虚拟环境中打开vscode项目

文章目录 【必备知识】打开anaconda虚拟环境切换到项目工作目录激活anaconda虚拟路径让vscode从当前目录打开 【必备知识】 anaconda环境变量配置及配置python虚拟环境 https://blog.csdn.net/xzzteach/article/details/140621596 打开anaconda虚拟环境 切换到项目工作目录 …

Ftrans文件摆渡方案:重塑文件传输与管控的科技先锋

一、哪些行业会用到文件摆渡相关方案 文件摆渡相关的产品和方案通常用于需要在不同的网络、安全域、网段之间传输数据的场景&#xff0c;主要是一些有核心数据需要保护的行业&#xff0c;做了网络隔离和划分。以下是一些应用比较普遍的行业&#xff1a; 金融行业&#xff1a;…

第 11 课:多方安全计算在安全核对的行业实践

业务背景&#xff1a;安全核对产生的土壤 产品方案&#xff1a;从试点到规模化的路 技术共建&#xff1a;与隐语的共同成长

three.js 空间坐标绘制多边形围栏(结合react)

空间坐标点绘制多边形&#xff0c;实际上可以理解为是由 “点” 到 “线” 到 “面” 的一个过程。将空间坐标点通过THREE.Shape绘制多条线并闭合而得到一个封闭的二维形状平面对象&#xff0c;使用THREE.ShapeGeometry将Shape对象转换为Geometry对象添加Mesh&#xff0c;最终得…

全国多地公布2024下半年软考报名具体时间

下半年开考科目&#xff1a; 高级资格&#xff1a;系统分析师、系统架构设计师、网络规划设计师、系统规划与管理师 中级资格&#xff1a;软件设计师、网络工程师、信息安全工程师、信息系统监理师、多媒体应用设计师、系统集成项目管理工程师 初级资格&#xff1a;网络管理…

【时时三省】(C语言基础)操作符2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 赋值操作符 它可以重新赋值 示例: 使用赋值操作符赋值 复合赋值符 &#xff0b;&#xff1d; -&#xff1d; &#xff0a;&#xff1d; /&#xff1d; &#xff05;&#xff1d; &g…

Linux磁盘管理_LVM逻辑卷_SWAP交换分区_Centos-LVM格式磁盘扩容

目录 一、基本磁盘管理1.1 创建分区1.2 创建文件系统1.3 挂载mount1.4 查看挂载信息1.5 重启失效解决方式 二、逻辑卷LVM2.1 LVM2.2 创建LVM2.3 扩大卷组VG2.4 命令汇总 三、交换分区SWAP管理3.1 SWAP3.2 查看swap3.3 增加交换分区 四、Centos调整分区&#xff0c;在线调整分区…

05 数据类型

目录 分类数值类型小数类型字符串类型日期和时间类型集合类型 1. 分类 2. 数值类型 tinyint create table t1 (num tinyint); insert into t1 values (1); insert into t1 values (128); – 越界插入&#xff0c;报错 select * from t1; 说明: 在mysql中&#xff0c;整形可以指…

LeetCode面试150——14最长公共前缀

题目难度&#xff1a;简单 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 横向扫描 3.2 纵向扫描 3.3 分治 3.4 二分查找 参考文献 1 题目描述 编写一个函数来查找字符串数组中的最长…

MyBatis 基本操作 - 注解版

目录 一&#xff0c;查询 - select 1.1 全列查询 1.2 指定列查询 1.3 赋值问题 方法一&#xff1a;起别名 方法二&#xff1a;结果映射 方法三&#xff1a;添加配置 二&#xff0c;新增 - Insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - Delete 四&am…

使用Gitlab实现monorepo多项目CICD

CI/CD是什么 CI/CD&#xff08;Continuous Intergration/Continuous Delpoy&#xff09;&#xff0c;即持续集成/持续部署&#xff0c;或称为持续集成/持续交付&#xff0c;作为一套面向开发和运维团队的解决方案&#xff0c;CI/CD 主要解决集成新代码和向用户频繁交付应用的问…

SQL注入实例(sqli-labs/less-22)

0、初始页面 1、确定闭合字符 闭合字符为单引号双引号 2、爆库名 3、爆表名 4、爆列名 5、查询最终目标