news 2026/5/22 12:50:12

简单谈谈ios开发中的UI

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单谈谈ios开发中的UI

UITableView

重用机制

let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseID, for: indexPath)

UITableView 内部维护了一个 重用缓存池

核心流程

  1. 缓存池结构:字典形式: key = 重用标识符,value = 闲置的 cell

  2. cell 滑出屏幕:系统自动把它扔进缓存池,标记为「可重用」;

  3. 需要新 cell:调用 dequeueReusableCell 方法

    优先去缓存池找对应重用标识符的闲置 cell,找到直接复用,没找到系统进行创建

  4. 重用标识符:唯一标识一种 cell 样式

UI数据源同步问题

在实际的设计中,我们经常会遇到多线程竞态问题,比如请求server的数据,这需要放到子线程来进行,但是在等待server返回的过程中,UITableView的数据有可能会被修改,server返回后再刷新UI就会出现已经修改的数据重置的问题,实际解决方案一般有两种

  1. 串行队列 设计一个串行队列,对于UI数据的操作放到串行队列去做即可

  2. 并发访问 数据拷贝 我们为子线程拷贝一份主线程的数据,当主线程对数据进行修改的时候,记录一下,然后当server数据返回时让其做同步修改即可

UI事件传递

UIView和CALayer

UIView为其提供内容,处理触摸等事件,参与响应链

CALayer负责显示内容contents

这体现了单一职责原则

事件传递和视图响应链

事件传递流程

🔥 传递方向:从上到下

传递顺序:点击屏幕 → UIApplication → UIWindow → 控制器根视图 → 父视图 → 子视图(倒序遍历,也就是说最后被添加的子视图最先响应)

note:对于每个子视图,先调用 pointInside 判断点是否在视图内,再递归调用子视图的 hitTest

point(inside:with:) 判断触摸点是否在当前视图范围内 hitTest(_:with:) 寻找并返回最终的响应视图
视图响应链

🔥 传递方向:从下往上

传递顺序:最佳响应视图 → 父视图 → ... → 控制器根视图 → UIViewController → UIWindow → UIApplication → AppDelegate

最佳视图重写 touchesBegan,touchesMove,touchedEnded方法 → 自己处理,事件终止(如果不重写,会一直向上抛,直到最顶层都不处理,该事件丢弃)

图像显示原理

UIView 本身不负责绘制和显示,真正负责像素显示、渲染、动画的是它的底层属性:CALayer。

iOS 屏幕显示是一套固定的流水线作业,分为 3 个阶段:CPU 预处理 → GPU 硬件渲染 → 屏幕刷新显示

CPU的工作

  • 布局计算:计算所有视图的 frame、AutoLayout 约束、文字宽高,确定视图位置大小

  • CPU绘制位图:如果你重写了 drawRect:,CPU 会进行软件绘制,生成位图

  • CPU 把所有图层、位图数据打包,通过Core Animation框架IPC 通信提交给 GPU的OpenGL管线

GPU的工作

顶点着色,图源装配,光栅化,片段着色,片段处理

提交像素点到帧缓冲区中

屏幕显示

手机屏幕默认 60Hz 刷新率(每 16.7ms 刷新一次)

屏幕发出 VSync(垂直同步信号),系统从帧缓冲区取出渲染好的画面,电子枪逐行扫描屏幕,显示像素,完成一帧显示,循环往复

UI掉帧

在规定的16.7ms内,在下一帧VSync信号到来之前,CPU和GPU并没有完成下一帧画面的合成

滑动优化方案

解决主线程卡顿

  1. 所有耗时操作全部丢子线程

  2. 图片子线程预解码,主线程只赋值展示

  3. 列表优先用 reloadRows 局部刷新,少用 reloadData

  4. 简化约束,复杂布局尽量用 Frame

  5. 提前初始化复用控件,不要滑动时临时创建 解决 GPU 渲染掉帧

  6. 尽量少用 圆角 + masksToBounds,避免离屏渲染

  7. 阴影一定要加 shadowPath,避免实时计算

  8. 减少视图嵌套,扁平化 UI 层级

  9. 删掉无用透明重叠 View,减少过度绘制

  10. 非必要不使用模糊、蒙版

UIView绘制原理

异步绘制

UIView 默认就是自己底层 layer 的 delegate,CALayer 绘制内容时,会优先询问代理:- (void)displayLayer:(CALayer *)layer;只要实现了这个方法,系统就不会走默认的主线程 drawRect:

该方法负责代理生成对应的位图,并生成对应的CGImage,并且设置其为Layer.contents属性的值

时序图

离屏渲染

在屏渲染:GPU的渲染操作在当前用于显示的屏幕缓冲区进行,画完直接等屏幕刷新显示

离屏渲染:GPU在当前屏幕缓冲区外新开辟一个缓冲区进行渲染操作,这就需要进行中转绘制 + 拷贝

何时触发

  1. 图层圆角 + maskToBounds

  2. 图层蒙版 || 阴影

  3. 光栅化

  4. 渐变叠加

debug

顶部菜单 Debug → Show Debug Settings

Color Offscreen - Rendered Yellow 界面黄色区域 = 正在发生离屏渲染

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 12:49:44

一次学习,终身复用:Hermes Agent 搭配 Kimi 大模型安装教程

前言在安装 Hermes Agent 时可以选择 Kimi 大模型,核心是两者设计理念高度契合,Kimi 能够支撑 Hermes 长程任务自主执行、多工具协同调用和技能自动沉淀的核心功能,尤其是 K2.6版本,凭借强势的超长上下文处理能力、原生且稳定的边…

作者头像 李华
网站建设 2026/5/22 12:49:17

3步掌握:如何用wxauto高效实现微信自动化管理

3步掌握:如何用wxauto高效实现微信自动化管理 【免费下载链接】wxauto Windows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人 项目地址: https://gitcode.com/gh_mirrors/wx/wxaut…

作者头像 李华
网站建设 2026/5/22 12:49:15

Akebi-GC逆向工程工具:内存注入与游戏数据拦截机制深度剖析

Akebi-GC逆向工程工具:内存注入与游戏数据拦截机制深度剖析 【免费下载链接】Akebi-GC (Fork) The great software for some game that exploiting anime girls (and boys). 项目地址: https://gitcode.com/gh_mirrors/ak/Akebi-GC Akebi-GC是一个基于C开发的…

作者头像 李华
网站建设 2026/5/22 12:45:38

思源宋体:从零开始的字体设计五部曲

思源宋体:从零开始的字体设计五部曲 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版发愁吗?你是否厌倦了千篇一律的字体选择,想要为你…

作者头像 李华
网站建设 2026/5/22 12:45:38

5分钟掌握全网盘直链下载:LinkSwift终极提速指南

5分钟掌握全网盘直链下载:LinkSwift终极提速指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 …

作者头像 李华
网站建设 2026/5/22 12:45:29

终极Windows键盘改造指南:5分钟学会自定义按键布局

终极Windows键盘改造指南:5分钟学会自定义按键布局 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys 你是…

作者头像 李华