UI视图相关
-
UITableView 相关
- 重用机制
- 数据源同步(新闻类app, 数据删除)
- 并发访问
- 串行访问
-
时间传递&视图响应
-
UIView&CALayer的区别(单一职责原则)
- UIView为其提供内容, 以及负责处理触摸事件,参与响应者链
-
CALayer
负责显示内容contents
-
事件传递过程
-
主要分为以下
1. -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event <返回触摸的view> 2. -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event <当前触摸点是否在view内>
-
view 处理触摸事件的流程:
事件传递过程点击屏幕 -->
UIApplication
-->UIWindow
-->hitTest
-->pointInside
-->Subviews
--> [UIView/其他同等级的UIView] --> 倒序遍历subviews -->hit = [sub hitTest:p withEvent:e]
; --> hit != nill --> return hit --> end
-
hitTest:withEvent 内部实现原理
hittest内部执行过程
-
视图事件响应
//- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸开始) //- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸移动) //- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸结束) //- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event (触摸取消)
-
图像显示原理
image.png
image.pngCPU
通过UIView
的CALayer
图层 (CALayer
的contents
属性) 调用drawRect
:方法绘制视图,通过CoreAnimation
传递到GPU
的OpenGL(ES)
渲染到屏幕上
GPU
渲染包括: 顶点着色, 图元装配, 光栅化, 片段着色, 片段处理
-
UI卡顿&掉帧
原因: 在正常情况下,视图刷新率应该是60FPS,即每秒刷新
60
下,CPU
和GPU
在每帧的规定时间内要完成UI的处理(UI排版,文字处理, 图片解码,合并图层)以便于在下次刷新信号来临的时候及时渲染到页面上. -
滑动优化方案
-
CPU
- 对象的创建,调整,销毁等在子线程处理
- UI的预排版(布局计算, 文本计算))
- 预渲染(文本等异步绘制,图片的编解码等操作)
-
GPU
- 纹理渲染
- 视图合并混合等
-
-
绘制原理&异步绘制
-
为什么在调用
setNeedsDisplay
的时候, 视图没有立即刷新-
当调用view 的
setNeedsDisplay
方法时, 底层会调用layer
的同名方法(view.layer setNeedsDisplay
),在
image.pngrunloop
将要结束的时候, 就会调用[CALayer display
]方法去刷新UI
-
如何实现异步绘制
需要手动实现layer的代理方法displayLayer
手动实现layer的代理方法,
主线程
会开子线程
去处理bitmap
对象,并通过coreGraphic
相关api处理上下文, 并生成图片返回给主队列
, 主队列赋值layer
的contents
属性用于显示- 代理负责生成对应的
bitmap
- 设置该bitmap作为
layer.contents
属性的值
- 代理负责生成对应的
-
-
-
离屏渲染
-
定义
- 在屏渲染(
on-screen-rendering
): 指GPU
的渲染操作在当前屏幕缓冲区内进行 - 离屏渲染(
off-screen-rendering
): 指GPU
在当前屏幕缓冲区外有另开辟缓冲区进行渲染操作.
- 在屏渲染(
-
何时出发
- 设置view的圆角(并与
maskToBounds
为YES) - 图层蒙版
- 阴影
- 光栅化
- 设置view的圆角(并与
-
为何要避免离屏渲染
- 在触发离屏渲染的时候,
GPU
开辟额外缓冲区进行渲染操作,增加了处理时长,导致UI的卡顿和掉帧
- 在触发离屏渲染的时候,
-
网友评论