iOS绘图框架
iOS的绘图框架有多种,我们平常最常用的就是UIKit,其底层是依赖CoreGraphics实现的,而且绝大多数的图形界面也都是由UIKit完成,并且UIImage、NSString、UIBezierPath、UIColor等都知道如何绘制自己,也提供了一些方法来满足我们常用的绘图需求。除了UIKit,还有CoreGraphics、Core Animation,Core Image,OpenGL ES等多种框架,来满足不同的绘图要求。各个框架的大概介绍如下:
UIKit:最常用的视图框架,封装度最高,都是OC对象
CoreGraphics:主要绘图系统,常用于绘制自定义视图,纯C的API,使用Quartz2D做引擎
CoreAnimation:提供强大的2D和3D动画效果
CoreImage:给图片提供各种滤镜处理,比如高斯模糊、锐化等
OpenGL-ES:主要用于游戏绘制,但它是一套编程规范,具体由设备制造商实现
绘图步骤
iOS中,完成一个UIView的绘图需要包含两个步骤:绘制和布局。
- 当一个UIView调用了setNeedsDisplay时,视图会被标记为“需要重新绘制”,那么在下一个绘制周期中,会调用UIView的drawRect方法进行绘制。
- 当一个UIView调用了setNeedsLayout时,表示该视图需要被“重新布局”,然后就会自动调用该UIView的layoutSubviews方法以及它的子视图的layoutSubviews。
绘制:drawRect。
drawRect提供了一个矩形画布供我们绘制图案。这一部分由CPU负责。
以下是来自官方文档的描述:
1、这个方法默认是不做任何事情的,如果我们这个View只是单纯设置一些背景或者使用layer对象来直接设置一些内容,那么我们不需要重写这个方法。当我们需要使用Core Graphics和UIKit来绘制这个View的内容时,我们需要重写这个方法。
2、当这个方法被调用时,这个View的环境已经被配置完成。你可以调用绘制的方法来渲染你的内容。你可以通过UIGraphicsGetCurrentContext。文档中还提到不要建立一个强引用UIGraphicsGetCurrentContext,因为它在多次调用drawRect期间可以被改变。
触发重新绘制的时机:
- 当遮挡你的视图的其他视图被移动或删除操作的时候
- 将视图的hidden属性声明设置为No,使其从隐藏状态变为可见
- 将视图滚出屏幕,然后再重新回到屏幕上
- 显式调用视图的setNeedsDisplay或者setNeedsDisplayInRect:方法
布局:layoutSubviews。
我们需要在layoutSubviews中对子控件进行frame的设置(大小和位置)。这一部分由GPU负责
触发layoutSubviews的时机:
- init初始化不会触发layoutSubviews
- addSubview会触发layoutSubviews
- 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
- 滚动一个UIScrollView会触发layoutSubviews
- 旋转Screen会触发父UIView上的layoutSubviews事件
- 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
使用UIKit
UIKit是