src: http://donbe.blog.163.com/blog/static/138048021201043093737950/
iPhone中,主要通过下面的几个技术来绘图
OpenGL, Quartz, UIKit or Core Animation
UIKit 是非线程安全的,所以最好把所有的绘图都放在主线程上执行
不管使用的哪个技术来绘图,所有的绘图都是在 UIView object 中进行, view决定绘图在那里进行
绘画周期
当一个view需要更新某一部分内容的时候,view会请求 drawRect: 方法
在view第一次请求drawRect方法的时候,传递的rectangle 参数一般是view的整个rectangle ,后续更新的时候,传递的一般是需要更新的那部分rectangle
在几种情况下,view会重新绘图
当请求了一个 drawRect:方法,view会标志自己已经被更新了,然后等待下一个更新请求的到达
坐标系统
current transformation matrix (CTM)
默认坐标原点是左上角
如果需要改变坐标系统,有两种方法:
图形上下文(Graphics Contexts)
当请求drawRect:方法 ,view object会自动配置图形环境,作为环境的一部分,uiview会创建一个图形上下文(a CGContextRef opaque type)
图形上下文定义基本图形属性,如颜色,剪切区域,线的宽度和样式信息,字体信息,合成选项,等等。
也可以自己创建图形上下文用 CGBitmapContextCreate 或者 CGPDFContextCreate 函数
需要注意的是,自己创建的图形上下文的原点是在左下角
CGContextSetRGBStrokeColor和CGContextSetRGBFillColor两个函数设置当前的笔锋色和填充色。
iPhone支持的图形格式
绘画技巧
提高图片质量
Quartz是Core Graphics的心脏, 主要提供以下东西
更多详细内容在:Core Graphics Framework Reference
UIKit是在Quartz的基本功能上的封装。他主要提供以下类
更多详细内容在:UIKit Framework Reference
配置图形上下文(CGContext)
在drawRect:中,view已经自动的为我们创建了图形上下文,我们可以通过函数UIGraphicsGetCurrentContext获取。
图形上下文使用堆栈来保存图像状态,CGContextSaveGState函数保存当前图像状态
CGContextRestoreGState函数来回到前面的版本
图片的绘画和创建
下面的几个场景,最好使用下面的方法
1>当view中只有一张图片,那么使用UIImageView来加载图片
2>用代码创建一张图片
两种方法:
1. 先用UIGraphicsBeginImageContext创建一个基于图片的图形上下文,画好图形后,用UIGraphicsGetImageFromCurrentImageContext 函数,生成图片,画完,最后用UIGraphicsEndImageContext 关闭图形上下文。
2. 用CGBitmapContextCreate创建图形上下文,在上面画图片,用CGBitmapContextCreateImage 创建CGImageRef,最后用CGImageRef来创建 UIImage。
把一张图片保存为jpg或者png
加载一张图片,然后用UIImageJPEGRepresentation或者UIImagePNGRepresentation函数获取加载的图片的NSData,然后用NSData生成png或者jpg。
创建和绘制路径
一个路径是一个二维几何场景,UIKit中包含UIRectFrame、UIRectFill这两个方法来创建简单的路径,比如矩形。Core Graphics中还包含了椭圆,等等。CGContextBeginPath来创建一个基于路径的图形上下文,然后开始创建路径。完事后,生成CGPathRef 或者CGMutablePathRef。最后用CGContextStrokePath和CGContextFillPath填充颜色。
参考:Graphics and Drawing in iOS