前言
本文简书地址:http://www.jianshu.com/p/be38212c0f79
写这文章的原因是最近在写CG的时候,对于CGContextSaveGState与UIGraphicsPushContext的区别感到有一些困惑,就做了一些试验在这里列出来。
CoreGraphics与UIKit
这边从iOS绘图教程 提取一些重要的内容。
Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES。
Core Graphics API所有的操作都在一个上下文中进行。所以在绘图之前需要获取该上下文并传入执行渲染的函数中。如果你正在渲染一副在内存中的图片,此时就需要传入图片所属的上下文。获得一个图形上下文是我们完成绘图任务的第一步,你可以将图形上下文理解为一块画布。如果你没有得到这块画布,那么你就无法完成任何绘图操作。当然,有许多方式获得一个图形上下文,这里我介绍两种最为常用的获取方法。
创建一个图片类型的上下文。调用
UIGraphicsBeginImageContextWithOptions
函数就可获得用来处理图片的图形上下文。利用该上下文,你就可以在其上进行绘图,并生成图片。调用UIGraphicsGetImageFromCurrentImageContext
函数可从当前上下文中获取一个UIImage对象。记住在你所有的绘图操作后别忘了调用UIGraphicsEndImageContext
函数关闭图形上下文。利用cocoa为你生成的图形上下文。当你子类化了一个UIView并实现了自己的
drawRect:
方法后,一旦drawRect:
方法被调用,Cocoa就会为你创建一个图形上下文,此时你对图形上下文的所有绘图操作都会显示在UIView上。
判断一个上下文是否为当前图形上下文需要注意的几点:
1. UIGraphicsBeginImageContextWithOptions
函数不仅仅是创建了一个适用于图形操作的上下文,并且该上下文也属于当前上下文。
2. 当drawRect
方法被调用时,UIView的绘图上下文属于当前图形上下文。
3. 回调方法所持有的context:参数并不会让任何上下文成为当前图形上下文。此参数仅仅是对一个图形上下文的引用罢了。
作为初学者,很容易被UIKit和Core Graphics两个支持绘图的框架迷惑。
UIKit
像UIImage、NSString(绘制文本)、UIBezierPath(绘制形状)、UIColor都知道如何绘制自己。这些类提供了功能有限但使用方便的方法来让我们完成绘图任务。一般情况下,UIKit就是我们所需要的。
使用UiKit,你只能在当前上下文中