iOS绘图机制和UIView相关方法调动时机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mangosnow/article/details/54513095

缘起:

在俄罗斯方块中,使用了继承UIView, 在drawRect中更新图片的方式完成的。 重新温习了一遍绘图方式

绘图框架关系

绘图 Core Graphics/Quartz

是C的API,苹果自己的一套东西

OpenGL ES 是一套接口规范

定义了方法结构函数,如何使用的规范,由相关的硬件商去实现

日常使用,CG框架上下文

大部分开发工作都是使用 Core Graphics 框架里面, Core Graphics 需要一个上下文,获得上下文有两种方式

创建一个图片类型的上下文

UIGraphicsBeginImageContextWithOptions
UIGraphicsGetImageFromCurrentImageContext
UIGraphicsEndImageContext

使用cocoa自带的图形上下文

自定义视图有三种方式

继承UIView

在drawRect: 直接完成绘图任务

新建图层,并新建图层代理

在代理中实现drawLayer:inContext: 方法完成绘图

自己生成ImageContext

UIGraphicsBeginImageContextWithOptions 这种方式,在上下文中成成一个UIImage对象,该对象就和UIView的内部方法调用顺序没什么关系了

使用方式组合

使用方式2种 和 定义视图方式3种结合后
所有可能的组合就有 2 * 3 = 6 种情况

UIView的相关方法调用情况

UIView的setNeedsDisplay和setNeedsLayout方法
setNeedsDisplay会调用UIView drawRect方法
setNeedsLayout 会调用Uivew layoutSubview方法

layoutSubviews

从名字上看,就是检测在子视图改变的情况时调用的方法
子视图发生了更改的情况:

  1. addsubview
  2. 设置frame
  3. 滚动scrolview
  4. 旋转子视图
  5. 直接调用 setLayoutSubview

drawRect被调用

从名字上看,在矩形里面画内容,自然就是对自己的视图进行绘制了,考虑到效率问题,不能时不时的去绘画一下,所以尽量少调用

  1. 在viewdidload 之后调用,完成绘制, 初始化时没有设置rect,不能调用drawRect方法
  2. 设置 sizeToFit 由系统调用
  3. contentModel 为 UIViewContentModeRedraw, 每次设置和更改frame都会自动调用drawRect
  4. 程序员调用setNeedsDisplay 或 setNeedsDisplayInRect

1、2 是系统行为, 3、4是程序员行为, 34放弃了系统的优化,尽管不提倡使用,有合适的理由,就放心用吧。

一点心得

重看一遍,就觉得技术文档要重复看,技术文档一般是没有多余的废话的。
苹果官方文档一开始我觉得很多废话,但是看了这么多发现他的废话是一遍一遍的加深你对概念的理解,同一句话在概况、细节、总结都会出现。目前接触到的文档,苹果官方文档是最友好的了。

猜你喜欢

转载自blog.csdn.net/mangosnow/article/details/54513095