iOS面试知识整理 - UI视图

173 阅读3分钟

UI视图

UITableview相关

重用机制

reuseid

数据源同步

事件传递&视图响应链

事件传递

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
-(Bool *)pointInside:(CGPoint)point withEvent:(UIEvent *)event

事件传递流程图.jpeg

视图响应链

响应链是从最合适的view开始传递,处理事件传递给下一个响应者,响应者链的传递方法是事件传递的反方法,如果所有响应者都不处理事件,则事件被丢弃。我们通常用响应者链来获取上几级响应者,方法是UIResponder的nextResponder方法。

一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象viewcontroller(如果存在),然后是它的父视图(superview)对象(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,该事件就被丢弃。一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。

视图响应链.png

图像显示原理

图像显示原理.jpeg

CPU工作

  • layout
    • UI布局
    • 文本计算
  • Display
    • 绘制-DrawRect
  • Prepare
    • 图片解编码
  • Commit
    • 提交位图

卡顿&掉帧

60FPS 也就是在16.7ms内,CPU和GPU并没有在规定时间内合成绘制好画面,就会导致卡顿和掉帧

滑动优化方案

CPU 对象创建、调整、销毁 预排版(布局计算、文本计算) 预渲染(文本等异步绘制、图片编解码) GPU 避免纹理渲染 视图混合、视图合成

绘制原理

系统绘制流程

绘制流程.jpeg

系统绘制流程

系统绘制流程.jpeg

异步绘制

[Layer.delegate displayLayer]

  • 代理负责生成对应的bitmap
  • 设置该bitmap作为layer.contents属性的值

时序图

绘制时序图.jpeg

离屏渲染

什么是离屏渲染 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

    1. 对象创建、调整、销毁
    2. 预排版(布局计算、文本计算)
    3. 预渲染(文本等异步绘制、图片编解码)
  • GPU

    1. 避免纹理渲染

    2. 视图混合、视图合成

什么是离屏渲染?

GPU在当前屏幕缓冲区外新开辟一个缓冲区来进行渲染操作,这样会导致CPU和GPU在图层操作时间超过16.7ms,这样就会导致掉帧和卡顿

UIView和CALayer之间的关系是怎样?

  • UIView继承UIResponse,CALayer继承NSObject

  • UIView为CALayer提供内容,以及负责处理触摸等事件、参与响应链、还有动画底层方法的高级API,UIView仅仅是对它的一层封装,实现了CALayer的delegate

  • CALayer负责显示内容Content 体现了六大设计原则之一:单一职责原则