ios开发 -- 八股 -- UI视图
UITableView
重用机制
包含三个方法:从重用池中取出可重用的View,向其中添加一个View,将当前使用的视图移动到可重用队列中
包含两个队列:等待使用的队列以及正在使用的队列
重用池通过懒加载的方式进行初始化
在使用的时候,如果池子里面没有组件,就创建一个,然后添加到池子里面
数据源同步
UI操作一般都是在主线程中进行,但是LoadMore一般都是在子线程中进行,我们如何进行数据同步
1. 并发访问,数据拷贝
在主线程删除数据的时候进行记录,在子线程要同步UI之前进行同步删除操作
2. 串行访问
当主线程要删除数据的时候,在串行队列中执行,然后等待一会,进行reload UI
UIView和CALayer
UIView为CALayer提供内容,以及负责处理触摸等事件,参与响应链
CALayer知识负责内容的显示
体现了单一职责原则
事件传递和视图响应链
这两个方法一个获取点击的视图,另一个判断点击位置是否在视图内部
事件传递流程如下
视图事件响应包含三个方法
在事件处理的传递上,如果一直不处理,就会一直向上传递,直到传递到UIapplicationdelecate,如果不处理,就会忽略这个事件
图像显示原理
CPU完成UI布局,文本计算和绘制,然后提交给GPU
GPU渲染管线:顶点着色,图源装配,光栅化,片段着色,片段处理,然后提交给FrameBuffer
UI卡顿和掉帧的原因
就是在下一帧到来之前,CPU和GPU没有完成画面的准备
滑动优化方案
基于CPU:将对象创建,调整,销毁放到子线程,预排版,预渲染
基于GPU:纹理渲染(避免离屏),视图混合:减少层级
UIview的绘制原理
会在一个事件的结束阶段进行绘制
使用【CALayer display】来进行绘制,这个方法会检测是否重写了displayLayer,如果没有,就进入系统绘制流程
离屏渲染
指的是当我们设置UI某些图层的属性,在未预合成之前,不能用于直接显示的时候,GPU在当前屏幕缓冲区以外开辟一个缓冲区进行渲染操作
何时会触发
圆角 + maskToBounds
图层蒙版
阴影
光栅化
为什么要避免:增加来GPU的工作量,可能导致掉帧