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

iOS事件传递和响应

 背景

对于身处中小公司且业务不怎么复杂的程序员来说,很多技术不常用,你可能看过很多遍也都大致了解,但是实际让你讲,不一定讲的清楚。你可能说,我以独当一面,应对自如了,但是技术的知识甚多,我们常用的只是十之一二,甚至更少。这么多知识,怎么更好的理解和学习?如果实操的场景少,推荐通过AI对话,不断的提问,然后对他的回答进行反复的验证校准,加深理解。

今天就住要讲一下iOS的事件传递和响应

事件传递和响应

1、概述

事件传递过程:从application传递到最上层view,如下图

事件传递过程

事件响应处理过程:从最上层view开始向下传递,与事件传递方向相反(响应链)

事件响应过程

2、事件传递细节 

当用户点击页面的某个位置时,application将触发事件传递

  • 从application到window,到ViewController,到view、subview
  • 如果某个view可以处理这个事件,则继续查找其子view,查找子view的时候从最后添加的开始检查,一旦某个子view可以处理这个事件则停止遍历,子view重复此过程。如果子view都不可处理事件则返回自己,事件查找结束。

什么条件算是“可以处理这个事件”,需要同时满足以下条件

  • view没有隐藏,hidden = NO

  • 允许交互,userInteractionEnabled = YES

  • 透明度alpha > 0.01,注意等于0.01的时候就已经无法响应事件了

  • pointInside: withEvent:返回YES,也就是说view覆盖区域包含点击位置。也可以重写函数,指定一定范围内的点击都算到自己身上(常用于扩大按钮的点击范围)。

所以传递过程的代码大致如下

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {// 检查视图是否满足基本条件if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {return nil;}// 检查触摸点是否在视图范围内if (![self pointInside:point withEvent:event]) {return nil;}// 从后往前遍历子视图NSInteger count = self.subviews.count;for (NSInteger i = count - 1; i >= 0; i--) {UIView *subview = self.subviews[i];// 将触摸点转换到子视图的坐标系中CGPoint subPoint = [self convertPoint:point toView:subview];// 递归调用子视图的 hitTest:withEvent: 方法UIView *hitView = [subview hitTest:subPoint withEvent:event];if (hitView) {return hitView;}}// 如果没有子视图能处理事件,则返回自身return self;
}

事件传递结束后,这个事件的响应链就定下来了,响应链之外的view就没有机会处理事件了,即使他可以处理也不行。这里解释一下,根据前面提到的传递规则,对于同一个view的子view,最后添加的拥有绝对的优先权,如果他能处理这个事件,则即使他不处理这个事件,他的兄弟view也么有机会处理。

3、事件响应

事件传递结束,响应链被确认,则进行事件响应阶段

从最后的view开始确认是否处理了事件,如果处理了,则停止向下传递,过程结束

事件响应

首先,根据处理方式的不同,可分为3种:

  • UIControl,如按钮通过 target-action 机制直接将事件传递给控件
  • 手势识别器,给view添加gestureRecognizer系列识别,绑定事件回调
  • 触摸事件链,通过view的touchesBegan、touchesEnded来拦截处理的自带事件

每种处理方式有各自的传递链条,不会串行,其中

  • UIControl,如果在最上层且“可以处理这个事件”,则父视图的其他方式(touche\gesture)会被阻断。应该他的内部实现上,将touche和gesture都阻断了。
  • 手势识别器(gestureRecognizer),如果子view添加了手势,则点击子view的时候,父view还会收到touchesBegan、touchesEnded的回调,也就是说touche和gesture会同时触发。如果父子view同时设置了手势(比如都是tapGesture),则子view会阻断手势事件的传递,父view不会收到点击事件。
  • 触摸事件链,如果想中断,则在touchesBegan中不调用super即可中断。如果不想中断,则实现touchesBegan处理事件的同时,可继续调用super,响应链的其他元素就还有机会收到事件和处理事件。

以上就是我对事件传递和响应的理解,其重点就是明白传递过程,传递的条件,响应链

那些容易让误解的词语

1、很多文章提到传递方向“从上到下”、“从下到上”,这样子讲,并不知道到底从哪到哪传递。本文结合了图片层级做了说明,希望大家能够明白。

2、查找响应者的过程,很多文章提到“如果view不能处理事件”则...,这种说法我是不赞同的,如果view不能处理事件,那根本就不会传给他,更别提进入响应链了。这里适合的词应该是“不处理”,或者更恰当点理解是“不拦截”。我们都知道,通过touchesBegan处理事件的时候,如果你调用了super方法,事件还会继续传递,这时候就可以有多个view同时响应事件

相关文章:

iOS事件传递和响应

背景 对于身处中小公司且业务不怎么复杂的程序员来说&#xff0c;很多技术不常用&#xff0c;你可能看过很多遍也都大致了解&#xff0c;但是实际让你讲&#xff0c;不一定讲的清楚。你可能说&#xff0c;我以独当一面&#xff0c;应对自如了&#xff0c;但是技术的知识甚多&a…...

TensorFlow 实现任意风格的快速风格转换

一、什么是风格迁移&#xff1f; 风格迁移&#xff08;Style Transfer&#xff09;是一种利用深度学习技术&#xff0c;将一幅图像的内容与另一幅图像的艺术风格相结合&#xff0c;生成新图像的技术。其核心思想是将图像的“内容”和“风格”分离&#xff0c;再重新组合&#…...

火绒终端安全管理系统V2.0【系统防御功能】

火绒企业版V2.0系统防御功能包含系统加固、应用加固、软件安装拦截、摄像头保护和浏览器保护。火绒终端安全管理软件V2.0守护企业用户终端安全。 系统防御 1. 系统加固 系统加固功能根据火绒提供的安全加固策略&#xff0c;当程序对特定系统资源操作时提醒用户可能存在的安…...

全志A133 android10 适配SLM770A 4G模块

一&#xff0c;模块基本信息 1.官方介绍 SLM770A是美格智能最新推出的一款LTE Cat.4无线通讯模组&#xff0c;最大支持下行速率150Mbps及上行速率50Mbps。同时向下兼容现有的3G和2G网络&#xff0c;以确保即使在偏远地区也可以进行网络通信。 SLM770A模组支持分集接收和MIMO技…...

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…...

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…...

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…...

NLP-RNN-LSTM浅析

双向 LSTM&#xff08;Bi - LSTM&#xff09; 结构原理&#xff1a;从图片中可以看到&#xff0c;双向 LSTM 由两个方向相反的 LSTM 组成&#xff0c;一个是正向 LSTM&#xff08;forward&#xff09;&#xff0c;一个是反向 LSTM&#xff08;backward&#xff09;。正向 LSTM …...

【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记

Cadence的Pcell designer官方入门教程 一、下载Pcell Designer 首先&#xff0c;前往Cadence网站下载Pcell Designer软件 &#xff08;具体安装过程就不记录了&#xff0c;大家自己去看视频吧&#xff09; 二、创建新的P-cell 然后打开Virtuoso&#xff0c;点击Tools->…...

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识&#xff0c;华夏&#xff0c;芊熠这三种车牌识别相机解密我都试过了&#xff0c;可以正常解密成功&#xff0c;其它品牌我暂时没有测试。超级简单&#xff0c;免费的&#xff0c;白嫖无敌&#xff01; 流程&#xff1a; ①&#xff1a;先导出配置文件&#xff0c;例如我以…...

一个前端,如何同时联调多个后端

文章目录 场景解决方案思路实现步骤创建项目目标前端配置安装cross-env配置vue.config.js配置package.json 测试 场景 一个前端&#xff0c;需要同时和N个后端联调 一个需求里有若干个模块&#xff0c;分别给不同的后端开发&#xff0c;前端需要和N个后端联调 本地开启一个端…...

向量的点乘的几何意义

源自AI 向量的点乘&#xff08;Dot Product&#xff09;在几何和图形学中有重要的意义。它不仅是数学运算&#xff0c;还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用&#xff1a; 1. 点乘的定义 对于两个向量 a 和 b&#xff0c;它们的点乘定义为&#xff1a;…...

如何组织和管理JavaScript文件:最佳实践与策略

在现代Web开发中&#xff0c;JavaScript已经成为不可或缺的一部分。随着项目规模的扩大&#xff0c;JavaScript代码的复杂性也随之增加。如何有效地组织和管理这些文件&#xff0c;不仅影响开发效率&#xff0c;还直接关系到项目的可维护性和可扩展性。本文将深入探讨如何组织和…...

mysql实时同步到es

测试了多个方案同步&#xff0c;最终选择oceanu产品&#xff0c;底层基于Flink cdc 1、实时性能够保证&#xff0c;binlog量很大时也不产生延迟 2、配置SQL即可完成&#xff0c;操作上简单 下面示例mysql的100张分表实时同步到es&#xff0c;优化备注等文本字段的like查询 创…...

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …...

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式&#xff1a; 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…...

R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...

全文链接&#xff1a;https://tecdat.cn/?p40365 在环境流行病学研究中&#xff0c;理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论&#xff0c;并引入了疾病映射以及对空间风险进行平滑处理…...

Java 反射 (Reflection) 详解

一、什么是 Java 反射&#xff1f; Java 反射 (Reflection) 是 Java 语言的一个强大特性&#xff0c;它允许 在运行时 检查和修改类、接口、字段和方法的信息&#xff0c;而不需要在编译时知道这些信息。 换句话说&#xff0c;反射可以让你在程序运行过程中“动态”地获取类的…...

在 C++ 中,`QMessageBox_s::question_s2` 和 `app.question_s2` 的区别(由DS-V3生成)

在 C 中&#xff0c;QMessageBox_s::question_s2 和 app.question_s2 的区别主要在于它们的调用方式和上下文范围。以下是对两者的详细解释&#xff1a; 1. QMessageBox_s::question_s2 解释&#xff1a; QMessageBox_s::question_s2 是一个静态成员函数的调用。它属于类 QMess…...

vxe-grid 通过配置式给单元格字段格式化树结构数据,转换树结构节点

vxe-grid 通过配置式给单元格字段格式化树结构数据&#xff0c;转换树结构节点 比如用户自定义配置好的数据源&#xff0c;通过在列中配置好数据&#xff0c;全 json 方式直接返回给前端渲染&#xff0c;不需要写任何格式化方法。 官网&#xff1a;https://vxetable.cn npm i…...

为什么ITK-SNAP能让你3倍提升医学图像分割效率:完整实战指南

为什么ITK-SNAP能让你3倍提升医学图像分割效率&#xff1a;完整实战指南 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 想象一下&#xff0c;你是一名医学研究员或临床医生&#xff0c;面对…...

如何用FanControl打造完美静音的Windows电脑散热方案?

如何用FanControl打造完美静音的Windows电脑散热方案&#xff1f; 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...

终极指南:简单三步重置Navicat试用期,让数据库管理工具无限使用

终极指南&#xff1a;简单三步重置Navicat试用期&#xff0c;让数据库管理工具无限使用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset…...

不止RealVNC!Windows远程管理树莓派:VNC、SSH与SMB文件共享的协同作战指南

Windows高效管理树莓派&#xff1a;VNCSSHSMB三剑客实战指南 树莓派作为一款功能强大的微型计算机&#xff0c;已经成为开发者、极客和科技爱好者的必备工具。但当你需要频繁在Windows系统上远程操作树莓派时&#xff0c;单一的工具往往难以满足所有需求——图形界面访问、命令…...

告别混乱!用MD04/MD07/ZMD06看懂SAP物料可用性,采购与生产计划不再抓瞎

SAP物料可用性实战指南&#xff1a;从MD04到ZMD06的高效决策路径 每天清晨&#xff0c;当供应链计划员、采购专员和生产调度员打开SAP系统时&#xff0c;面对MD04事务码中密密麻麻的物料需求数据&#xff0c;最迫切需要解答的三个问题是&#xff1a;哪些物料会短缺&#xff1f;…...

线上热修复不求人:手把手教你用Arthas的jad、mc、redefine三件套无感更新Bug代码

线上热修复实战&#xff1a;用Arthas三件套实现无感代码更新 当生产环境突然爆出紧急Bug时&#xff0c;每个开发者都面临两难选择&#xff1a;要么顶着压力重启服务&#xff0c;要么忍受故障持续影响业务。去年双十一大促期间&#xff0c;我们的支付系统就遭遇过这样的惊魂时刻…...

WarcraftHelper:魔兽争霸3免费增强插件终极使用指南

WarcraftHelper&#xff1a;魔兽争霸3免费增强插件终极使用指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上运行不畅…...

开箱即用的CAM++镜像:一条命令启动,告别复杂环境配置

开箱即用的CAM镜像&#xff1a;一条命令启动&#xff0c;告别复杂环境配置 1. 为什么选择CAM说话人识别系统 在语音识别领域&#xff0c;说话人验证一直是个技术难点。传统方案往往需要复杂的开发环境配置、繁琐的依赖安装和漫长的调试过程。而CAM镜像彻底改变了这一局面&…...

裸机驱动开发不再抓狂,VSCode一键生成SVD解析+寄存器智能提示+外设时序图(附NXP i.MX RT1064实测工程包)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;裸机驱动开发的痛点与VSCode嵌入式新范式 裸机驱动开发长期面临工具链割裂、调试低效、跨平台支持薄弱等系统性挑战。传统基于 Eclipse-CDT 或 Keil MDK 的工作流难以统一配置管理&#xff0c;且缺乏现…...

时间序列预测:滑动窗口技术与监督学习转换实战

1. 时间序列预测的核心挑战时间序列数据与传统的监督学习数据集有着本质区别。传统监督学习中&#xff0c;每个样本都是独立同分布的&#xff0c;而时间序列数据点之间存在严格的时间依赖关系。这种特性使得我们不能直接套用常规的机器学习方法。我曾在金融风控项目中处理过大量…...