当前位置: 首页 > news >正文

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

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

      • 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,如果都没有响应则事件丢弃。

相关文章:

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

事件传递链和响应者链总结 1. 事件传递链:事件传递链:传递流程:总结第一响应者: 2. 响应者链响应者链传递流程总结响应者链流程 总结: 之前也学习过这个内容这次在复习的时候,就想着写一下总结:…...

【多线程】初识进程和线程

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 前言 在我们之前编写的所有代码,都只能用上一个核心。众所周知,现在大多数CPU都有多个核心,但此时,无论如法优化程序&#xff0c…...

1DCNN-2DResNet并行故障诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...

Java设计模式(原型模式)

定义 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 角色 Prototype(抽象原型角色) ConcretePrototype(具体原型角色) Client(客户端角色 优点 简化对象的创建过程&#xff0c…...

C/C++ 知识点:typedef 关键字

文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言: 在C(以及C语言)中,typedef 关键字…...

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑进程间通信🐬进程间通信目的 📚管道 📕管道的原理🐧用fork来共享管道原…...

小团队如何选需求管理软件?8款顶级推荐

本文将分享8款适合小团队的需求管理软件:PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时,寻找合适的软件工具常常让人头疼,不同的需求管理软件提供各种功能,但哪些功能真正适合…...

docker操作入门

1.创建镜像,使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...

简单的射箭小游戏网页源码

简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目: 题解: class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...

0x3 “护网行动”守之道

一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS(入侵防御系统)WAF(Web应用防火墙)IDS(入侵检测系统&a…...

白骑士的Matlab教学高级篇 3.1 高级编程技术

系列目录 上一篇:白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色,帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

haproxy简介与用法

一、负载均衡 1.1、概念: 负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统…...

Geoscene Pro的三维

一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中,两个场景可以自由切换。 (1)全局场景有固定的坐标系GCS(WGS84、CGCS2000),并在全球比例尺下展示(全球范围)。可以…...

论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023

1. 论文背景 密集子图发现(Densest Subgraph Discovery)是图挖掘领域的一个基础研究方向,并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域,密集子图的发现对理解复杂网络结构和行为具有重要…...

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...

MemoryCache 缓存 实用

MemoryCache 缓存 实用,相关逻辑代码里已详细注释&#xff0c; 在Java中创建一个单例模式&#xff08;Singleton Pattern&#xff09;的MyMemoryCache类&#xff0c;可以采用多种方法&#xff0c;其中最常见的是使用“饿汉式”和“懒汉式”&#xff08;线程安全和非线程安全&am…...

Java设计模式(命令模式)

定义 将一个请求封装为一个对象&#xff0c;从而让你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。 角色 抽象命令类&#xff08;Command&#xff09;&#xff1a;声明用于执行请求的execute方法&#xff0c;通…...

什么是 CI/CD?

什么是 CI/CD&#xff1f; CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发实践&#xff0c;旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量&#xff0c;使团队能够更快地响应市场变化和…...

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

使用要求 1、用的是google里面的扩展打包成crx文件&#xff0c;所以在使用之前你需要确保自己电脑上有google浏览器&#xff0c;而且google浏览器版本需要在124之上。&#xff08;要注意一下&#xff0c;就是电脑只能有一个Chrome浏览器&#xff09; 2、在win10上用vscode开发…...

告别卡顿!用AutoDL云GPU+VS Code远程开发,5分钟搞定深度学习环境搭建

告别卡顿&#xff01;用AutoDL云GPUVS Code远程开发&#xff0c;5分钟搞定深度学习环境搭建 当你在本地运行ResNet50模型时&#xff0c;风扇狂转如直升机起飞&#xff0c;而epoch进度条却像蜗牛爬行——这场景每个深度学习开发者都不陌生。传统本地开发环境面临三大困境&#x…...

Qwen-Image-Edit-F2P教程:Gradio界面实时交互调试+生成过程进度条可视化原理

Qwen-Image-Edit-F2P教程&#xff1a;Gradio界面实时交互调试生成过程进度条可视化原理 想玩转AI图像编辑&#xff0c;但被复杂的命令行和漫长的等待劝退&#xff1f;今天&#xff0c;我们来点不一样的。我将带你深入一个开箱即用的AI图像编辑工具——Qwen-Image-Edit-F2P&…...

告别本地跑不动:用PyCharm+AutoDL SSH远程调试PAI0具身智能项目,模型视频一键生成

云端开发新范式&#xff1a;PyCharmAutoDL高效调试具身智能项目实战 最近在复现PAI0具身智能项目时&#xff0c;我发现了一个让本地低配笔记本也能流畅开发AI模型的绝佳组合——PyCharm专业版AutoDL云服务器。这种开发模式完美解决了本地算力不足的痛点&#xff0c;同时保留了I…...

Windows下OpenClaw安装指南:对接Phi-3-vision-128k-instruct图文模型

Windows下OpenClaw安装指南&#xff1a;对接Phi-3-vision-128k-instruct图文模型 1. 为什么选择OpenClawPhi-3-vision组合 去年我在处理大量图文混排的学术资料时&#xff0c;发现传统自动化工具难以理解图片中的表格和公式。直到尝试将OpenClaw与多模态模型结合&#xff0c;…...

圆柱电池气动点焊机:高精度焊接新标杆,LangChain 学习 - LangChain 引入(LangChain 概述、LangChain 的使用场景、LangChain 架构设计)。

圆柱电池气动点焊机的技术优势 圆柱电池气动点焊机采用高精度气动加压系统&#xff0c;压力稳定控制在0.2-0.5MPa范围内&#xff0c;配合伺服驱动可实现0.01mm的焊接位置精度。该设备搭载恒流控制逆变焊接电源&#xff0c;输出电流波动小于1%&#xff0c;确保每个焊点电阻值差异…...

策略模式:灵活切换算法的艺术,C++多态。

策略模式概述 策略模式是一种行为设计模式&#xff0c;允许在运行时选择算法的行为。它将算法封装成独立的类&#xff0c;使得它们可以互相替换&#xff0c;而不会影响客户端代码。策略模式的核心思想是将算法的定义与使用分离&#xff0c;增强系统的灵活性和可扩展性。 策略模…...

STM32 智能垃圾桶项目笔记(二):基于TIM4与中断回调的超声波测距逻辑优化与实战

1. TIM4定时器在超声波测距中的关键作用 在智能垃圾桶项目中&#xff0c;超声波测距的准确性直接决定了自动开盖功能的可靠性。原始方案使用TIM3实现1μs延时已经解决了触发信号的问题&#xff0c;但Echo信号的高电平时间测量需要更高精度的方案。这就是TIM4定时器大显身手的地…...

ThinkPHP3.x核心特性全解析

好的&#xff0c;我们来梳理一下 ThinkPHP 3.x 版本的主要特性&#xff1a;MVC 架构支持&#xff1a;严格遵循模型(Model)-视图(View)-控制器(Controller)的设计模式。清晰分离业务逻辑、数据操作和页面展示&#xff0c;便于协作开发和维护。路由支持&#xff1a;支持多种 URL …...

jupyter Kernel Disconnected崩溃的修复

问题描述由于博主执行了pip install tensorflow2.13.0这个傻逼操作降级了很多底层库&#xff08;比如 numpy, typing-extensions 等&#xff09;导致这些底层的变动把 Jupyter 本身的运行环境搞崩了&#xff0c;启动不了 Python 内核。启动后也显示Disconnected而且点击运行后&…...

DSP数字电源方案:C2000系列主控TMS32F28069 Buck-Boost双向变换器(...

DSP数字电源方案 Buck-Boost双向变换器 数字控制方式:C2000系列 主控TMS32F28069 300W&#xff0c;8A&#xff0c;输入10-75V&#xff0c;输出5-75V 双向升降压功率转换器buck-boost结构 提供主板PCB&#xff0c;原理图(AD格式)&#xff0c;源代码&#xff0c;无控制板资料。 …...