两种绘图框架UIKIT、Core Graphics,三种获取上下文方式
1、UIKIT
UIKIT只能在当前上下文绘制,苹果封装了UIKIT内部的很多类,使他们可以在当前上下文直接绘制,比如UIImage(绘制图片)、UIColor(绘制颜色)、UIBezierPath(绘制贝塞尔曲线)、NSString(绘制文本)等等,以面向对象的方式来实现了绘制。
2、Core Graphics
Core Graphics是苹果自己实现的一套基于C的绘图API,使用它的条件是获得上下文的引用(CGContextRef)
绘图上下文获取方式
想要绘图则需要两个东西,一个是上面提到的绘图框架(相当于画笔、墨汁等),另一个就是绘图上下文(相当于画布),那么绘图上下文怎么获得呢?有三种方法:
1. UIGraphicsBeginImageContextWithOptions()方法(位图上下文,绘图后需要调用UIGraphicsEndImageContext)
2. drawRect:(CGRect)rect方法(图层上下文,无法手动创建)
3. drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx方法
UIKIT绘图在drawRect和UIGraphicsBeginImageContextWithOptions方式获取上下文的情况下,可以直接使用,因为在drawRect内部其实就相当于是在当前上下文中,而UIGraphicsBeginImageContextWithOptions方法创建的图形上下文也属于是当前上下文。但是在drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx中我们只是拿到了一个图形上下文的引用,此时我们需要用UIGraphicsPushContext 方法将context参数转换为当前上下文,最后使用UIGraphicsPopContext恢复上下文环境
Core Graphics在使用之前只要获得上下文引用即可进行绘图,如果没有上下文引用,可以通过UIGraphicsGetCurrentContext获得上下文应用,
两种绘图框架,三种获取上下文方式,那么我们绘图其实就有了六种方法。
待补充。。。
CGContextSaveGState方法和CGContextRestoreGState方法的作用,自己画了个图:如下