iOS 中,用户点击一个按钮到响应的全部流程

devtools/2025/1/15 18:06:17/

在 iOS 中,当用户点击一个按钮(或其他 UI 控件)时,会触发一系列复杂的操作流程,从硬件到软件,再到应用层的事件处理。以下是从用户点击一个按钮到应用响应的完整流程:

  1. 硬件层:触摸事件的生成

    • 用户用手指点击屏幕。
    • 屏幕(电容式触摸屏)检测到用户的触摸事件。触摸屏幕的电容变化会被屏幕的传感器检测到。
    • 触摸控制器(Touch Controller)将这些电容变化转化为电信号。

  2. 硬件驱动层:事件传递到操作系统内核

    • 电信号通过硬件总线传递到设备的触摸屏控制器(Touch Screen Controller)。
    • 触摸屏控制器通过中断通知设备的主处理器(CPU),告知其触摸事件的发生。
    • iOS 内核中的触摸驱动程序(Touch Driver)接收触摸事件,并将其转化为可理解的坐标数据(如屏幕上的位置)。

  3. iOS 内核和系统框架层:事件生成和传递

    • 内核将触摸事件封装成IOHIDEvent(I/O Human Interface Device Event)事件对象。
    • IOHIDEvent 事件传递给 iOS 的用户层,通常通过 IOKit 和 CoreGraphics 等框架进行处理。
    • iOS 系统中的 UIApplication 类接收并处理低级别的触摸事件,然后将它们转化为更高层的 UIKit 事件(如 UIEvent)。

  4. UIKit 框架层:事件分发

    • UIApplication 对象作为应用的主事件循环的入口,它接收到事件后会分发给合适的窗口对象(UIWindow)。
    • UIWindow 对象根据事件的位置,找到事件目标视图(UIView)并将事件传递给它。
    • 视图(UIView)层次结构中的每一个视图都可以通过 hitTest(:with:) 方法确定触摸事件的最接近的目标视图。
    • 触摸事件从根视图(通常是应用的主窗口)开始,沿着视图层次结构向下传递。
    • 每个视图的 hitTest(
    :with:) 方法会调用 point(inside:with:) 方法,判断事件的坐标是否在该视图的区域内。
    • 最终,事件传递给包含该坐标的最深层次的视图,即最前面的视图。

  5. UIView 层:事件处理

    • 找到目标视图后,该视图会接收触摸事件,并调用相应的事件处理方法。
    • 对于触摸事件,目标视图会调用 touchesBegan(:with:)、touchesMoved(:with:)、touchesEnded(:with:) 或 touchesCancelled(:with:) 方法。
    • 这些方法由目标视图的类实现,可以被子类重写以自定义事件处理逻辑。
    • 如果视图是一个按钮(UIButton),并且已设置了目标和操作(Target-Action),UIKit 会自动调用相应的操作方法。
    • 按钮内部定义了事件处理方法,如 touchUpInside,当触摸在按钮内抬起时,会触发该方法。

  6. 目标-动作(Target-Action)机制:动作触发

    • 当按钮收到触摸事件时,会检查是否设置了 Target-Action 处理程序。
    • 如果设置了 Target-Action,UIKit 框架会调用目标对象的对应方法(通常是视图控制器中的一个方法)。

  7. 应用层:动作方法执行

    • 目标对象(通常是 UIViewController 或自定义的视图类)执行与 Target-Action 关联的动作方法。
    • 在这个动作方法中,可以定义任何应用程序逻辑,如导航到另一个视图控制器、更新 UI、发起网络请求等。

  8. 视图的更新与显示

    • 如果动作方法改变了应用的状态或需要更新 UI,会调用 UIKit 方法,如 setNeedsDisplay() 或 layoutIfNeeded()。
    • UIKit 将这些更新请求排队,并在下一个主线程循环周期重新渲染和更新 UI。

  9. 主运行循环:事件循环继续

    • 主运行循环继续运行,等待下一次事件触发,如用户的另一次触摸或定时器触发等。

总结

整个过程涉及多个层次,从硬件传感器检测到用户触摸,到操作系统内核处理事件,再到 UIKit 事件分发和应用层的响应。这个流程保证了 iOS 应用在用户与设备交互时能够实时响应,并提供流畅的用户体验。


http://www.ppmy.cn/devtools/105665.html

相关文章

Java导出图片到excel

1、例如你有这样一个集合,具体结合你的业务场景 Data public class Student {/*** 姓名*/private String xh;/*** 学号*/private String xm;/*** 照片*/private byte[] zp; }2、相关代码 RequestMapping(value "/quereImgByPkid/{pkid}",method Requ…

C++ 满足某些条件可以当成rust 用

c 内存安全性较差,但是满足某些条件其实也挺安全的 1.所有堆上分配的内存包裹在容器里,弃用指针。感觉容器的栈挂堆(stack point to heap)的结构就是和rust学的 2.灵活使用std::move()转移所有权(ownership)提高效率。 3.引用注意…

2.SpringBoot项目pom.xml文件配置

1.pom.xml示例&#xff08;初始项目创建时生成&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

VS2022使用指定的LLVM版本

LLVM下载地址&#xff1a;Releases llvm/llvm-project GitHub LLVM/Clang toolsets for Visual Studio 2022, 2019, 2017, 2015, 2013, 2012 and 2010. GitHub - zufuliu/llvm-utils: LLVM/Clang toolsets for Visual Studio 2022, 2019, 2017, 2015, 2013, 2012 and 2010.…

Docker 数据卷管理及优化

目录 1 数据卷实现的目的 2 为什么要用数据卷 3 docker的两种数据卷 3.1 bind mount 数据卷 实践实例&#xff1a; 3.2 docker managed 数据卷 实验实例&#xff1a; 3.3 bind mount 数据卷和docker managed 数据卷的对比 3.3.1 相同点&#xff1a; 3.3.2 不同点&#xff1a; …

设计模式 18 备忘录模式

设计模式 18 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

DPDK基础入门(二):Cache与大页优化

Cache简介 目前Cache主要由三级组成: L1 Cache, L2 Cache和Last Level Cache(LLC)。 L1最快&#xff0c;但容量小&#xff0c;可能只有几十KB。LLC慢&#xff0c;但容量大&#xff0c;可能多达几十MB。 L1和L2 Cache一般集成在CPU内部。另外,&#xff0c;L1和L2 Cache是每个处…

css-functions-属性函数

概述 本文主要介绍CSS Functions中和属性有关的函数var、attr和env 使用方法可以参考示例&#xff1a;CSS-Functions:属性函数 自定义属性var var()函数可以插入一个自定义属性CSS 变量的值&#xff0c;用来代替非自定义属性中值的任何部分。 自定义属性名必须是以--开头的…