当前位置: 首页 > 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,如果都没有响应则事件丢弃。
http://www.lryc.cn/news/421409.html

相关文章:

  • 【多线程】初识进程和线程
  • 1DCNN-2DResNet并行故障诊断模型
  • Java设计模式(原型模式)
  • C/C++ 知识点:typedef 关键字
  • 【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池
  • 小团队如何选需求管理软件?8款顶级推荐
  • docker操作入门
  • 简单的射箭小游戏网页源码
  • Python | Leetcode Python题解之第331题验证二叉树的前序序列化
  • 0x3 “护网行动”守之道
  • 白骑士的Matlab教学高级篇 3.1 高级编程技术
  • haproxy简介与用法
  • Geoscene Pro的三维
  • 论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023
  • 前端框架(三件套)
  • MemoryCache 缓存 实用
  • Java设计模式(命令模式)
  • 什么是 CI/CD?
  • 【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发
  • 【苍穹外卖JAVA项目】第2天:新增员工
  • 队列的实现及循环队列
  • docker部署zookeeper和kafka
  • (13)zabbix的监控-1
  • Redis相关面试题(二)
  • Docker Compose与私有仓库
  • AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例
  • Java线程池和执行流程
  • 进程信号的产生与处理
  • 统一响应结果封装,Result类的实现【后端 06】
  • 明日周刊-第20期