本文代码参考:http://www.cnblogs.com/kenshincui/p/3959951.html
Quartz2D绘制2D图形
在iOS中常用的绘图框架就是Quartz2D, Quartz2D是CoreGraphics框架的一部分, 强大的二维图像绘制引擎, Quartz2D在UIKit框架中也有很好的集成, UIKit中的组件都是由CoreGraphics进行绘制的,
iOS中绘图一般分为以下几个步骤:
1. 获取绘图上下文
2. 创建并设置路径
3. 将路径添加到上下文
4. 设置上下文的状态
5. 绘制路径
6. 释放路径
这里需要注意的是:
1.Core Graphics是基于C语言的一套框架,开发时无法像使用Obj-C一样调用;
2.在Quartz 2D中凡是使用带有“Create”或者“Copy”关键字方法创建的对象,在使用后一定要
使用对应的方法释放(由于这个框架基于C语言编写无法自动释放内存);
3.Quartz 2D是跨平台的,因此其中的方法中不能使用UIKit中的对象(UIKit只有iOS可用),
例如用到的颜色只能用CGColorRef而不能用UIColor,但是UIKit中提供了对应的转换方法
;
4.在C语言中枚举一般以“k”开头,由于Quartz 2D基于C语言开发,所以它也不例外(参数中
很多枚举都是k开头的);
5.由于Quartz 2D是Core Graphics的一部分,所以API多数以CG开头;
6.在使用Quartz 2D绘图API中所有以“Ref”结尾对象,在声明时都不必声明为指针类型;
7.在使用Quartz 2D绘图API时,凡是“UI”开头的相关绘图函数,都是UIKit对Core Graphics的
封装(主要为了简化绘图操作);
图形上下文CGContextRef代表图形输出设备(绘制的位置), 包含了绘制图形的一些设备信息, Quartz2D中的所有对象最终都会绘制到上下文上(上下文可以是位图Bitmap, PDF, 窗口Window, 层Layer, 打印对象Print)
绘制效果 :
直接上代码简单粗暴, 很好理解, 注释很全:
// // Quartz2DView.m // Quartz2DView // // Created by 帝炎魔 on 16/5/25. // Copyright © 2016年 帝炎魔. All rights reserved. // #import "Quartz2DView.h" @implementation Quartz2DView /** * Quartz2D绘制2D图形 在iOS中常用的绘图框架就是Quartz2D, Quartz2D是CoreGraphics框架的一部分, 强大的二维图像绘制引擎, Quartz2D在UIKit框架中也有很好的集成, UIKit中的组件都是由CoreGraphics进行绘制的, iOS中绘图一般分为以下几个步骤: 1. 获取绘图上下文 2. 创建并设置路径 3. 将路径添加到上下文 4. 设置上下文的状态 5. 绘制路径 6. 释放路径 图形上下文CGContextRef代表图形输出设备(绘制的位置), 包含了绘制图形的一些设备信息, Quartz2D中的所有对象最终都会绘制到上下文上(上下文可以是位图Bitmap, PDF, 窗口Window, 层Layer, 打印对象Print) * */ // 绘图只能在此方法中调用, 否则无法得到当前图形上下文 - (void)drawRect:(CGRect)rect { // 1. 取得图形上下文对象 CGContextRef context = UIGraphicsGetCurrentContext(); // // 2. 创建路径对象 // CGMutablePathRef path = CGPathCreateMutable(); // // CGPathMoveToPoint(path, nil, 20, 50); // 设置路径的起始点 // CGPathAddLineToPoint(path, nil, 20, 100); // 从起始点开始绘制 // CGPathAddLineToPoint(path, nil, 300, 100); // 绘制另一条直线, 从上一个直线终点开始绘制 // // // 3. 添加路径到上下文 // CGContextAddPath(context, path); // // // 4, 设置图形上下文状态属性 // CGContextSetRGBStrokeColor(context, .5, 0, 0, 1); // 设置描边颜色 // CGContextSetRGBFillColor(context, 1.0, 0, 0, 1); // 设置填充颜色 // CGContextSetLineWidth(context, 5.0); // 设置线条的宽度 // CGContextSetLineCap(context, kCGLineCapRound); // 设置顶点的样式 (起始点和终点) // CGContextSetLineJoin(context, kCGLineJoinBevel); // 设置连接点的样式(中间点) // // /** // * 设置线段样式 // phase : 虚线开始的位置 // lengths : 虚线长度间隔 // count : 虚线数组元素的个数 // */ // CGFloat lengths[2] = {18, 9}; // CGContextSetLineDash(context, 0, lengths, 2); // // /** // * 设置阴影 // context : 图形上下文 // offset : 阴影的偏移量 // blur : 模糊度 // color : 阴影的颜色 // */ // CGColorRef color = [UIColor brownColor].CGColor; // 将UIKit的Color转换下格式 // CGContextSetShadowWithColor(context, CGSizeMake(10, -10), 0.7, color); // // // 5. 绘制图像到指定图形上下文 // /** // * CGPathDrawingMode是填充方式,枚举类型 // kCGPathFill:只有填充(非零缠绕数填充),不绘制边框 // kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充) // kCGPathStroke:只有边框 // kCGPathFillStroke:既有边框又有填充 // kCGPathEOFillStroke:奇偶填充并绘制边框 // */ // CGContextDrawPath(context, kCGPathFillStroke); // 最后一个参数是填充的类型 // // // // 释放对象 // CGPathRelease(path); // CGColorRelease(color); // CGContextRelease(context); #pragma mark --- 简化的绘图方式 // 直线 [self drawLineWithContext:context]; // 矩形 [self drawRectWithContext:context]; // 利用UIKit封装的方法绘制矩形 [self drawRectByUIKitWithContext:context]; // 绘制椭圆 [self drawEllipse:context]; // 绘制弧形 [self drawArcWithContext:context]; // 绘制贝塞尔曲线 // [self drawCurve:context]; // 图像绘制 // [self drawImage:context]; // 绘制文字 // [self drawTextWithContext:context]; } #pragma mark --- 绘制直线 - (void)drawLineWithContext:(CGContextRef)context { // 1. 绘制路径 CGContextMoveToPoint(context, 20, 50); CGContextAddLineToPoint(context, 20, 100); CGContextAddLineToPoint(context, 300, 100); // 2. 封闭路径 CGContextClosePath(context); // 3. 设置图形上下文 [[UIColor redColor] setStroke]; // 设置描边颜色 [[UIColor greenColor] setFill ]; // 设置填充颜色 // [[UIColor redColor] set] // 同时设置描边和填充颜色 // 4. 绘制路径 CGContextDrawPath(context, kCGPathFillStroke); } #pragma mark ---- 绘制矩形 - (void)drawRectWithContext:(CGContextRef)context { // 1. 添加矩形的对象 CGContextAddRect(context, CGRectMake(100, 120, 200, 20)); // 2. 设置属性 [[UIColor redColor] set]; // 3. 绘制 CGContextDrawPath(context, kCGPathFillStroke); } #pragma mark --- 绘制矩形----> 利用UIKit的封装方法 - (void)drawRectByUIKitWithContext:(CGContextRef)context { [[UIColor brownColor] set]; UIRectFill(CGRectMake(100, 150, 200, 20)); [[UIColor redColor] setStroke]; UIRectFrame(CGRectMake(100, 200, 200, 20)); } #pragma mark --- 绘制椭圆 - (void)drawEllipse:(CGContextRef)context { // 添加对象, 绘制椭圆 , 先创建一个矩形 CGContextAddEllipseInRect(context, CGRectMake(100, 240, 200, 100)); // 设置属性 [[UIColor redColor] setStroke]; [[UIColor greenColor] setFill]; // 设置描边的宽度 CGContextSetLineWidth(context, 5); CGContextDrawPath(context, kCGPathFillStroke); } #pragma mark --- 绘制弧形 - (void)drawArcWithContext:(CGContextRef)context { /** * 添加弧形对象 x : 中心点的 x坐标 y : 中心点的 y坐标 radius : 半径 startAngle : 起始弧度 endAngle : 终止弧度 closeWise : 是否逆时针绘制, 0则顺时针绘制, 1 逆时针绘制 */ CGContextAddArc(context, 200, 450, 50, 0, M_PI * 3 / 2 , 0); // 设置属性 [[UIColor blueColor] set]; // 绘制图形 CGContextDrawPath(context, kCGPathFillStroke); } #pragma mark ---- 绘制贝塞尔曲线 /** * 利用路径可以绘制直线, 同时利用路径也可以绘制不规则曲线, 都属于路径绘制 Quartz2D绘制曲线分为两种, 一个是二次贝塞尔曲线, 还有一个是三次贝塞尔曲线 贝塞尔曲线需要起始点, 终止点 和控制点 二次贝塞尔曲线只有一个控制点, CGContextAddQuadCurveToPoint(CGContextRef c, CGFloat cpx, CGFloat x, CGFloat y); 三次贝塞尔曲线是有两个控制点 CGContextAddCurveToPoint(context, CGFloat) */ - (void)drawCurve:(CGContextRef)context { // 绘制曲线 设置移动的起始点 CGContextMoveToPoint(context, 20, 100); /** * 绘制二次贝塞尔曲线 第一个参数 : 控制点的位置 第二个参数 : 终止点的位置 */ CGContextAddQuadCurveToPoint(context, 200, 40, 300, 100); // 设置贝塞尔曲线的起始点 CGContextMoveToPoint(context, 20, 300); /** * 绘制三次贝塞尔曲线 第一个参数 : 第一个控制点的坐标位置 第二个参数 : 第二个控制点的坐标位置 第三个参数 : 终止点的坐标 */ CGContextAddCurveToPoint(context, 100, 200, 200, 500, 300, 300); // 设置颜色 [[UIColor redColor] setFill]; [[UIColor greenColor] setStroke]; // 绘制路径 CGContextDrawPath(context, kCGPathFillStroke); } #pragma mark --- 将图像绘制到图形上下文 - (void)drawImage:(CGContextRef)context { // 使用UIKit中封装的方法进行图像绘制 坐标原点为左上角 UIImage *image = [UIImage imageNamed:@"shaonv"]; // 绘制到指定Rect矩形中 [image drawInRect:self.bounds]; // 以一个起始点绘制图片 // [ image drawAtPoint:<#(CGPoint)#>]; // 以平铺式 绘制图片 // [image drawAsPatternInRect:self.bounds]; } #pragma mark ---- 绘制文字 - (void)drawTextWithContext:(CGContextRef)context { // 绘制到指定区域的内容 NSString *string = @"Star Walk is the most beautiful stargazing app you’ve ever seen on a mobile device. It will become your go-to interactive astro guide to the night sky, following your every movement in real-time and allowing you to explore over 200, 000 celestial bodies with extensive information about stars and constellations that you find"; CGRect rect = CGRectMake(20, 50, 280, 300); UIFont *font = [UIFont systemFontOfSize:18]; // 设置字体 UIColor *color = [UIColor redColor]; // 设置字体颜色 // 设置段落样式 NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; NSTextAlignment align = NSTextAlignmentLeft; // 对齐方式 style.alignment = align; [string drawInRect:rect withAttributes:@{NSFontAttributeName:font, NSForegroundColorAttributeName:color, NSParagraphStyleAttributeName : style}]; } @end