UI视图
UITableview相关
重用机制
reuseid
数据源同步
事件传递&视图响应链
事件传递
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
-(Bool *)pointInside:(CGPoint)point withEvent:(UIEvent *)event
视图响应链
响应链是从最合适的view开始传递,处理事件传递给下一个响应者,响应者链的传递方法是事件传递的反方法,如果所有响应者都不处理事件,则事件被丢弃。我们通常用响应者链来获取上几级响应者,方法是UIResponder的nextResponder方法。
一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象viewcontroller(如果存在),然后是它的父视图(superview)对象(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,该事件就被丢弃。一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。
图像显示原理
CPU工作
- layout
- UI布局
- 文本计算
- Display
- 绘制-DrawRect
- Prepare
- 图片解编码
- Commit
- 提交位图
卡顿&掉帧
60FPS 也就是在16.7ms内,CPU和GPU并没有在规定时间内合成绘制好画面,就会导致卡顿和掉帧
滑动优化方案
CPU 对象创建、调整、销毁 预排版(布局计算、文本计算) 预渲染(文本等异步绘制、图片编解码) GPU 避免纹理渲染 视图混合、视图合成
绘制原理
系统绘制流程
系统绘制流程
异步绘制
[Layer.delegate displayLayer]
- 代理负责生成对应的bitmap
- 设置该bitmap作为layer.contents属性的值
时序图
离屏渲染
什么是离屏渲染 offsecreen Rendering
GPU在当前屏幕缓冲区外新开辟一个缓冲区来进行渲染操作
何时会触发
- 圆角,maskToBound
- 图层蒙版
- 阴影
- 光栅化
为什么要避免
- 创建新的渲染缓冲区
- 上下文切换,会导致耗时 GPU在当前屏幕缓冲区外新开辟一个缓冲区来进行渲染操作,这样会导致CPU和GPU在图层操作时间超过16.7ms,这样就会导致掉帧和卡顿
UI视图面试总结
系统的UI事件传递机制是怎样?
事件传递主要通过两个方法
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
-(Bool *)pointInside:(CGPoint)point withEvent:(UIEvent *)event
使UItableView滚动更加流程的方案和思路都有哪些?
-
CPU
- 对象创建、调整、销毁
- 预排版(布局计算、文本计算)
- 预渲染(文本等异步绘制、图片编解码)
-
GPU
-
避免纹理渲染
-
视图混合、视图合成
-
什么是离屏渲染?
GPU在当前屏幕缓冲区外新开辟一个缓冲区来进行渲染操作,这样会导致CPU和GPU在图层操作时间超过16.7ms,这样就会导致掉帧和卡顿
UIView和CALayer之间的关系是怎样?
-
UIView继承UIResponse,CALayer继承NSObject
-
UIView为CALayer提供内容,以及负责处理触摸等事件、参与响应链、还有动画底层方法的高级API,UIView仅仅是对它的一层封装,实现了CALayer的delegate
-
CALayer负责显示内容Content 体现了六大设计原则之一:单一职责原则