一:Quartz 2D介绍:
①二维图形绘制引擎,支持iOS环境和Mac OS X环境
②是CoreGraphics框架的一部分,其中的很多数据类型和方法都是CG开头。会经常见到Quartz 2D和CoreGraphics两个术语交互使用
③Quartz与分辨率和设备无关,所以绘制的时候不需要考虑最终绘图的目标和设备。
(2)Quartz内存管理:
①使用含有“Create”或”Copy”的函数创建的对象,使用完后必须释放。(这符合C语言中申请内存,释放内存的原则)
(3)Quartz 2D的坐标系:
①默认的坐标系统:原点(0,0)在左下角。
②iOS的UIKit框架的坐标系中,原点在左上角
所以要进行坐标转换:(请见下文代码示例中的:绘制图形图片)
(4)drawRect和layoutSubViews的对比
setNeedsLayout:异步调用layoutSubViews(布局子视图)
setNeedsDisplay:异步调用drawRect(绘图)
代码示例
①绘制直线:(新建UIView类,实现如下主要方法。至于矩形、圆、贝塞尔曲线的绘制方法大同小异,不一一举例)
绘制方法:
-(void) drawRect:(CGRect)rect {
//1.直接获取图形上下文
CGContextRef context = UIGraphicsGetCurrentContext();
[self drawLine:context];
}
//①基本绘制方法
-(void) drawLine:(CGContextRef)context {
//2.创建图形路径
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 50, 50); //起点
CGPathAddLineToPoint(path, NULL, 100, 100); //增加点
CGPathAddLineToPoint(path, NULL, 50, 100);
CGPathCloseSubpath(path); //连接首尾点,闭合视图(可选)
//3.将路径添加到图形上下文
CGContextAddPath(context, path);
//4.设置图形属性
CGContextSetRGBStrokeColor(context, 0, 1, 0, 1);
CGContextSetRGBFillColor(context, 1, 0, 0, 1);
CGContextSetLineWidth(context, 3);
//5.绘制
CGContextDrawPath(context, kCGPathFillStroke);
//6.释放路径
CGPathRelease(path);
}
//②绘制常用方法(简便)
-(void) drawLine2:(CGContextRef) context {
CGPoint points[] = {{50,50}, {200, 200}, {50, 200}, {50, 50}};
CGContextAddLines(context, points, 4);
[[UIColor redColor] setStroke];
[[UIColor greenColor] setFill];
CGContextSetLineWidth(context, 3);
CGContextDrawPath(context, kCGPathFillStroke);
}
②绘制图片图形
-(void) drawImage:(CGContextRef) context {
//1.创建UIImage
UIImage *image = [UIImage imageNamed:@"ali.jpg"];
// 2.坐标转化
// (1)保存图形上下文,确保绘制的内容不变形
CGContextSaveGState(context);
// (2)转换左边系
//翻转图形
CGContextScaleCTM(context, 1, -1);
//把翻转后的图形移回原位
CGContextTranslateCTM(context, 0, -image.size.height);
// (3)绘制:UIImage类切记要转换成CG类
CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
// (4)恢复context
CGContextRestoreGState(context);
}