缘起:
在俄罗斯方块中,使用了继承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
从名字上看,就是检测在子视图改变的情况时调用的方法
子视图发生了更改的情况:
- addsubview
- 设置frame
- 滚动scrolview
- 旋转子视图
- 直接调用 setLayoutSubview
drawRect被调用
从名字上看,在矩形里面画内容,自然就是对自己的视图进行绘制了,考虑到效率问题,不能时不时的去绘画一下,所以尽量少调用
- 在viewdidload 之后调用,完成绘制, 初始化时没有设置rect,不能调用drawRect方法
- 设置 sizeToFit 由系统调用
- contentModel 为 UIViewContentModeRedraw, 每次设置和更改frame都会自动调用drawRect
- 程序员调用setNeedsDisplay 或 setNeedsDisplayInRect
1、2 是系统行为, 3、4是程序员行为, 34放弃了系统的优化,尽管不提倡使用,有合适的理由,就放心用吧。
一点心得
重看一遍,就觉得技术文档要重复看,技术文档一般是没有多余的废话的。
苹果官方文档一开始我觉得很多废话,但是看了这么多发现他的废话是一遍一遍的加深你对概念的理解,同一句话在概况、细节、总结都会出现。目前接触到的文档,苹果官方文档是最友好的了。