一,quartz2d基本绘图
Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统。利用UIKit框架,我们可以搭建和实现一些简单的,常见的UI界面。但是,有些UI界面极其复杂,而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子。
1,上下文:Graphics Context
封装了Quartz绘制图像到输出设备的信息它保存了绘图信息,绘图状态以及图形的输出目标。
2,坐标系:跟UI保持一致
3,内存管理:出现Create,copy,retain时要释放。
4,绘制图形
1)绘制一条直线
-(void)drawLine{
//获取一个与视图相关联的上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//---------------------
#if 1
//构建路径
CGMutablePathRef path=CGPathCreateMutable();
//设置路径起点
CGPathMoveToPoint(path,NULL, 10, 10);
//添加路径
CGPathAddLineToPoint(path, NULL, 50, 50);
CGPathAddLineToPoint(path, NULL, 10, 60);
CGPathAddLineToPoint(path, NULL, 60, 100);
//关闭路径,闭环,不关闭时,首尾不会连接
CGPathCloseSubpath(path);
//添加路径到上下文
CGContextAddPath(context, path);
//释放path
CGPathRelease(path);
#else
//第二种添加路径方式
CGContextMoveToPoint(context, 10, 10);
CGContextAddLineToPoint(context, 50, 50);
CGContextAddLineToPoint(context, 10, 60);
CGContextAddLineToPoint(context, 60, 100);
CGContextClosePath(context);
#endif
//---------------------
//设置画笔RGB颜色
// CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
[[UIColor purpleColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 6);
//---------------------
//设置填充颜色,填充颜色,会在路径封闭的区域内进行填充
// CGContextSetRGBFillColor(context, 0, 0, 1, 1);
[[UIColor greenColor]setFill];
//---------------------
//设置线段链接样式
/*
kCGLineJoinMiter, 斜角,一起尖角
kCGLineJoinRound, 圆角
kCGLineJoinBevel 斜角,各自斜角
*/
CGContextSetLineJoin(context, kCGLineJoinBevel);
//设置线帽样式
/*
kCGLineCapButt,
kCGLineCapRound,
kCGLineCapSquare
*/
CGContextSetLineCap(context, kCGLineCapSquare);
//设置虚线
CGFloat lengths[]={5,10};
//绘制虚线的四个参数:
/*
1,上下文
2,phase相位
3,数组
4,数组长度
绘制法则:首先绘制5-2个点,跳过10个点,再绘制5个点,跳过10个点..
如果lengths是{5,10,12}:首先绘制5-2个点,跳过10个点,再绘制12个点,跳过5个点,再绘制10个点,跳过12个点。。。
*/
CGContextSetLineDash(context, 2, lengths, 3);
//绘制路线
/*
kCGPathFill, 表示用非零绕数规则
kCGPathEOFill, 表示用奇偶规则
kCGPathStroke, 表示描线,不填充;
kCGPathFillStroke, 表示填充和描线;
kCGPathEOFillStroke 描线填充
*/
//绘制填充和描线
// CGContextDrawPath(context, kCGPathFillStroke);
//只绘制填充
CGContextFillPath(context);
//只描线
CGContextStrokePath(context);
}
2)绘制一个矩形
-(void)drawRect{
//获取上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//设置颜色填充
[[UIColor redColor]setFill];
//设置画笔颜色
[[UIColor greenColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 2);
//填充矩形:
// CGContextFillRect(context, CGRectMake(50, 50, 100, 100));
UIRectFill(CGRectMake(50, 50, 100, 100));
//绘制矩形
CGContextStrokeRect(context, CGRectMake(50, 50, 100, 100));
//添加一个矩形到context,这个方法不会直接绘制矩形,需要调用绘制方法
CGContextAddRect(context, CGRectMake(150, 100, 40, 40));
CGContextStrokePath(context);
}
3)绘制一条弧线
-(void)drawArc{
//获取上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//设置画笔颜色
[[UIColor purpleColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 10);
//设置线帽
CGContextSetLineCap(context, kCGLineCapButt);
/*
参数说明:
1,上下文
2 3,x,y表示弧的中心点
4,半径
5,起始弧度
6,结束弧度
7,是否顺时针方向0表示顺时针,1表示逆时针
*/
CGContextAddArc(context, 200, 200, 5, 0, M_PI, 1);
CGContextStrokePath(context);
}
4)绘制文本
-(void)drawText{
NSString * text=@"看这里哦";
//设置颜色
[[UIColor purpleColor]setStroke];
UIFont * font=[UIFont fontWithName:@"Marker Felt" size:20];
[text drawAtPoint:CGPointMake(100, 100) withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor]}];
CGRect rect = CGRectMake(50, 200, 200, 40);
[[UIColor blueColor]set];
UIRectFill(rect);
[[UIColor redColor]set];
// 只能用居中、左、右对齐
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentCenter;
[text drawInRect:rect withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor],NSParagraphStyleAttributeName:paragraph}];
//关于文字font更多Attributes http://blog.sina.com.cn/s/blog_8d1bc23f0101etmr.html
}
5)绘制图像
-(void)drawImage{
UIImage * image=[UIImage imageNamed:@"hehe"];
//从某个点开始,原图大小绘制
[image drawAtPoint:CGPointMake(10, 10)];
//在某个rect中绘制,会拉伸,收缩
[image drawInRect:CGRectMake(0, 0, 80, 80)];
//在某个rect中平铺
[image drawAsPatternInRect:CGRectMake(0, 100, 80, 80)];
}
6)坐标系的平移,旋转和缩放
-(void)drawSome{
// 取出上下文
CGContextRef context = UIGraphicsGetCurrentContext();
[[UIColor redColor]setStroke];
//平移操作----------------------
// 备份上下文
CGContextSaveGState(context);
// 对上下文做一个平移操作
CGContextTranslateCTM(context, 50, 50);
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
[[UIColor blackColor]setStroke];
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
//旋转操作----------------------
//备份上下文
CGContextSaveGState(context);
// 对坐标系进行旋转,按照原点进行旋转
CGContextRotateCTM(context, M_PI_4);
[[UIColor greenColor]setStroke];
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
//缩放操作----------------------
//备份上下文
CGContextSaveGState(context);
// 原点不动,坐标系宽高缩放
CGContextScaleCTM(context, 0.5, 0.5);
[[UIColor purpleColor]setStroke];
CGContextStrokeRect(context, CGRectMake(10, 10, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
}
Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统。利用UIKit框架,我们可以搭建和实现一些简单的,常见的UI界面。但是,有些UI界面极其复杂,而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子。
1,上下文:Graphics Context
封装了Quartz绘制图像到输出设备的信息它保存了绘图信息,绘图状态以及图形的输出目标。
2,坐标系:跟UI保持一致
3,内存管理:出现Create,copy,retain时要释放。
4,绘制图形
1)绘制一条直线
-(void)drawLine{
//获取一个与视图相关联的上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//---------------------
#if 1
//构建路径
CGMutablePathRef path=CGPathCreateMutable();
//设置路径起点
CGPathMoveToPoint(path,NULL, 10, 10);
//添加路径
CGPathAddLineToPoint(path, NULL, 50, 50);
CGPathAddLineToPoint(path, NULL, 10, 60);
CGPathAddLineToPoint(path, NULL, 60, 100);
//关闭路径,闭环,不关闭时,首尾不会连接
CGPathCloseSubpath(path);
//添加路径到上下文
CGContextAddPath(context, path);
//释放path
CGPathRelease(path);
#else
//第二种添加路径方式
CGContextMoveToPoint(context, 10, 10);
CGContextAddLineToPoint(context, 50, 50);
CGContextAddLineToPoint(context, 10, 60);
CGContextAddLineToPoint(context, 60, 100);
CGContextClosePath(context);
#endif
//---------------------
//设置画笔RGB颜色
// CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
[[UIColor purpleColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 6);
//---------------------
//设置填充颜色,填充颜色,会在路径封闭的区域内进行填充
// CGContextSetRGBFillColor(context, 0, 0, 1, 1);
[[UIColor greenColor]setFill];
//---------------------
//设置线段链接样式
/*
kCGLineJoinMiter, 斜角,一起尖角
kCGLineJoinRound, 圆角
kCGLineJoinBevel 斜角,各自斜角
*/
CGContextSetLineJoin(context, kCGLineJoinBevel);
//设置线帽样式
/*
kCGLineCapButt,
kCGLineCapRound,
kCGLineCapSquare
*/
CGContextSetLineCap(context, kCGLineCapSquare);
//设置虚线
CGFloat lengths[]={5,10};
//绘制虚线的四个参数:
/*
1,上下文
2,phase相位
3,数组
4,数组长度
绘制法则:首先绘制5-2个点,跳过10个点,再绘制5个点,跳过10个点..
如果lengths是{5,10,12}:首先绘制5-2个点,跳过10个点,再绘制12个点,跳过5个点,再绘制10个点,跳过12个点。。。
*/
CGContextSetLineDash(context, 2, lengths, 3);
//绘制路线
/*
kCGPathFill, 表示用非零绕数规则
kCGPathEOFill, 表示用奇偶规则
kCGPathStroke, 表示描线,不填充;
kCGPathFillStroke, 表示填充和描线;
kCGPathEOFillStroke 描线填充
*/
//绘制填充和描线
// CGContextDrawPath(context, kCGPathFillStroke);
//只绘制填充
CGContextFillPath(context);
//只描线
CGContextStrokePath(context);
}
2)绘制一个矩形
-(void)drawRect{
//获取上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//设置颜色填充
[[UIColor redColor]setFill];
//设置画笔颜色
[[UIColor greenColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 2);
//填充矩形:
// CGContextFillRect(context, CGRectMake(50, 50, 100, 100));
UIRectFill(CGRectMake(50, 50, 100, 100));
//绘制矩形
CGContextStrokeRect(context, CGRectMake(50, 50, 100, 100));
//添加一个矩形到context,这个方法不会直接绘制矩形,需要调用绘制方法
CGContextAddRect(context, CGRectMake(150, 100, 40, 40));
CGContextStrokePath(context);
}
3)绘制一条弧线
-(void)drawArc{
//获取上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//设置画笔颜色
[[UIColor purpleColor]setStroke];
//设置线宽
CGContextSetLineWidth(context, 10);
//设置线帽
CGContextSetLineCap(context, kCGLineCapButt);
/*
参数说明:
1,上下文
2 3,x,y表示弧的中心点
4,半径
5,起始弧度
6,结束弧度
7,是否顺时针方向0表示顺时针,1表示逆时针
*/
CGContextAddArc(context, 200, 200, 5, 0, M_PI, 1);
CGContextStrokePath(context);
}
4)绘制文本
-(void)drawText{
NSString * text=@"看这里哦";
//设置颜色
[[UIColor purpleColor]setStroke];
UIFont * font=[UIFont fontWithName:@"Marker Felt" size:20];
[text drawAtPoint:CGPointMake(100, 100) withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor]}];
CGRect rect = CGRectMake(50, 200, 200, 40);
[[UIColor blueColor]set];
UIRectFill(rect);
[[UIColor redColor]set];
// 只能用居中、左、右对齐
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentCenter;
[text drawInRect:rect withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:[UIColor redColor],NSParagraphStyleAttributeName:paragraph}];
//关于文字font更多Attributes http://blog.sina.com.cn/s/blog_8d1bc23f0101etmr.html
}
5)绘制图像
-(void)drawImage{
UIImage * image=[UIImage imageNamed:@"hehe"];
//从某个点开始,原图大小绘制
[image drawAtPoint:CGPointMake(10, 10)];
//在某个rect中绘制,会拉伸,收缩
[image drawInRect:CGRectMake(0, 0, 80, 80)];
//在某个rect中平铺
[image drawAsPatternInRect:CGRectMake(0, 100, 80, 80)];
}
6)坐标系的平移,旋转和缩放
-(void)drawSome{
// 取出上下文
CGContextRef context = UIGraphicsGetCurrentContext();
[[UIColor redColor]setStroke];
//平移操作----------------------
// 备份上下文
CGContextSaveGState(context);
// 对上下文做一个平移操作
CGContextTranslateCTM(context, 50, 50);
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
[[UIColor blackColor]setStroke];
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
//旋转操作----------------------
//备份上下文
CGContextSaveGState(context);
// 对坐标系进行旋转,按照原点进行旋转
CGContextRotateCTM(context, M_PI_4);
[[UIColor greenColor]setStroke];
CGContextStrokeRect(context, CGRectMake(0, 0, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
//缩放操作----------------------
//备份上下文
CGContextSaveGState(context);
// 原点不动,坐标系宽高缩放
CGContextScaleCTM(context, 0.5, 0.5);
[[UIColor purpleColor]setStroke];
CGContextStrokeRect(context, CGRectMake(10, 10, 100, 50));
// 恢复上下文
CGContextRestoreGState(context);
}