UI视图篇

UITableView相关

重用机制

  • 字母索引条

数据源同步问题

  • 并发访问、数据拷贝

  • 串行访问

事件传递&视图响应

UIView和CALayer

  • UIView 为其提供内容,以及负责处理触摸事件,参与响应链

  • CALayer负责显示内容contents

设计模式:单一职责原则(职责分工)

事件传递


- (UIView*)hitTest:(CGPoint)pointwithEvent:(UIEvent*)event

- (BOOL)pointInside:(CGPoint)pointwithEvent:(UIEvent*)event

image

点击屏幕 -> UIApplication -> UIWindow -> hitTest:withEvent: -> pointInside:withEvent:


    override func touchesBegan(_touches:Set, with event:UIEvent?)

    override func touchesMoved(_touches:Set, with event:UIEvent?)

    override func touchesCancelled(_touches:Set, with event:UIEvent?)

没有处理的事件 就会丢弃,不是引起崩溃 Tip(和方法找不到区分开)

图像显示原理

经过CPU、GPU、Frame Buffer(帧缓冲区)、视频控制器、显示器

CPU: Layout -> Display -> Prepare -> Commit

- Layout: UI布局和文本计算

- Display:绘制(drawRect:)

- Prepare:图片编解码

- Commit:提交位图

GPU渲染管线

- 顶点着色

- 图元装配

- 光栅化

- 片段着色

- 片段处理

卡顿&掉帧

image

滑动优化方案

CPU:
- 对象的创建、调整、销毁
- 预排版(布局计算、文本计算)
- 预渲染(文本等异步绘制,图片编解码等)
GPU:

  • 纹理渲染*(离屏渲染)
  • 视图混合*

绘制原理&异步绘制

image

离屏渲染

  • On-Screen Rendering

意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行

  • Off-Screen Rendering

意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

何时会触发?

  • 圆角(当和maskToBounds一起使用时)

  • 图层蒙版

  • 阴影

  • 光栅化

为何要避免?

会增加GPU的工作量,导致CPU+GPU的工作时间大于16.7ms 造成卡顿、掉帧

你可能感兴趣的:(UI视图篇)