Quartz2D
quartz2D 是一个二维绘图引擎,同时支持iOS和Mac OS X系统 (跨平台,纯C语言的)。包含在core Graphics框架中
Quartz 2D能完成的工作
绘制图形
绘制文字
绘制\生成图片
Quartz 2D 绘图主要步骤
- 获取图形上下文对象
CGContextRef ctx = UIGraphicsGetCurrentContext()
- 拼接路径,同时向图形上下文添加路径
CGContextMoveToPoint(ctx,50,50);
CGContextAddLineToPoint(ctx,100,100);
注意Add操作的时候,画笔是不抬起来的,move操作画笔才会抬起来
- 渲染
CGContextStrokePath(ctx);
什么是图形上下文
是一个CGContextRef类型的数据
图形上下文主要包括如下信息
绘图路径(各种各样的图形)
绘图状态(颜色、线宽、样式、旋转、缩放、移动)
输入目标(会知道什么地方去?UIView、图片、PDF、打印机等)
绘图的方式
绘图的第二种方法:
- 获取图形上下文
CGContextRef ctx = UIGraphicsGetCurrentContext()
- 拼接路径
CGMutablepathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,50,50);
CGPathAddLineToPoint(path,NULL,100,100);
- 把路径添加到上下文中
CGContextAddPath(ctx,path)
- 渲染
CGContextStrokePath(ctx);
绘图的第三种方法
- 获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
- 拼接路径
UIBezierPath *path = [UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(50,50)];
[path addLineToPoint:CGPointMake(100,100)];
- 把路径添加到上下文中
CGContextAddPath(ctx,path.CGPath);
- 渲染
`CGContextStrokePath(ctx);
绘图的第四种方式
获取上下文
路径
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,50,50);
CGPathAddLineToPoint(path,NULL.100,100);
%%把c的path转成oc的path
UIBezierPath *path1 = [UIBezierPath bezierPathWithCGPath:path];
[path1 addLineToPoint:CGPointMake(150,50)];
- 添加到上下文中
CGContextAddPath(ctx,path1.CGPath);
- 渲染
CGContextStrokePath(ctx);
绘图的第五种方法
- 路径
UIBezierPath *path = [UIZBezierPath bezierPath];
[path movePoint:CGPointMake(50,50);]
[paht addLineToPoint:CGPointMake(100,100)]
- 渲染
[path stroke];
drawrect概述
为什么要把代码写在drawrect中
因为drawrect可以获取正确的上下文
drawrect的rect参数的含义
rect就是当前view的bounds
drawrect什么时候会被调用
当这个view第一次显示的时候
重绘的时候
如何重绘
调用当前view的setNeedsDisplay方法
调用当前view的setNeedsDisplayInRect, rect表示刷新区域
为什么不能手动调用drawrect
手动调用可能获取不到正确的上下文
圆角半径误差
圆角半径有1/3的误差 在大于圆角半径的2/3 都是一个圆形
椭圆画法
OC: -� bezierPathWithOvalInRect:CGRectMake();
C : CGContextRef ctx = UIGraphicsGetCurrentPath();
弧的画法
OC
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake() radius: startAngle: endAngle: clockwise:]
arcCenter : 圆心
radius : 半径
startAngle : 起始位置
endAngle : 终止位置
clockwise : 是否顺时针
C
CGContextAddArc(ctx,150,150,100,-M_PI_2,M_PI_2,0);
clockwise 在C中iOS环境下是反的:在Mac OS X中是正常的
设置样式(C)
设置线宽
CGContextSetLineWidth(上下文,线宽);
连接处的样式
CGContextSetLineJoin(上下文,kCGLineJoinxxx);
kCGLineJoinMiter 默认
kCGLineJoinRound 圆角
kCGLineJoinBevel 切角
设置头尾的样式
CGContextSetLineCap(上线下文,kCGLineCapxxx);
kCGLineCapButt 默认
kCGlineCapRound 圆角
kCGlineCapSquare 比默认长一个线宽的距离
设置线的颜色
CGContextSetRGBStrokeColor(上下文,color)
[[UIColor redColor] setStroke]
也可以设置颜色
设置样式(OC)
线宽
[path setLineWidth:30];
头尾的样式
[path setLineCapStyle:kCGLineCapRound];
连接处的样式
[path setLineJoinStyle:kCGLineJoinRound];
颜色
[[UIColor redColor] setStroke];
画三角形
除了普通的画法,将先单纯的连接起来还有一种关闭路径的方法
CGContextClosePath(ctx);{在最后的位置和起始的位置连成一条线}
在OC中[path closePath]
渲染(C)
分为两大种
一种是stroke 一种是fill (填充)
CGContextStrokePath();
CGContextFillPath();
CGContextDrawPath(ctx,kCGPathFill) = CGContextFillPath(cox);
两句话等价 都是填充渲染
stroke(描边)同理
渲染(OC)
[path stroke];
[path fill];
既填充又描边两句话都执行一次
奇偶填充
说明被覆盖过奇数次的点填充,被覆盖过偶数次的不填充
C语言
CGContextDrowPath(ctx,kCGPathEoFill)
OC语言
path.useEvenOddFillRule = YES;
[path fill];
矩阵操作
注意该操作 是对于上下文进行操作的 要在对路径操作之前执行
平移
CGContextTranslateCTM();
旋转
CGContextRotateCTM();
缩放
CGContextScaleCTM();
图形上下文栈
创建完成上下文后 保存上下文 ,在需要的时候再恢复
CGContextSaveGState(ctx);
备份
CGContextRestoreGState();
恢复
注意 这是一个栈 需要入栈和出栈
绘制文字
[(NSString *) drawAtPoint: withAttribute:]
从指定位置开始绘制文字
[(NSString *) drawAtRect: withAttribute:]
attribute 传一个字典,这个字典中有文字个各种属性
NSDictionary *dict = @{NSFontAttributeName : [UIFont systemFontOfSize:(NSInteger)]
,
NSForegroundColorAttributeName : [UIColor redColor]
::前背景::
NSBackgroundColorAttribute : [UIColor blueColor]
::后背景::
NSUnderLineStyleAttributeName : @(3)
}`::下划线::
NSShadow *shadow = [NSShadow alloc] init
shadow.shadowOffset = CGSizeMake(50,59)
阴影的偏移量
绘制图片
UIImage *image = [UIImage imageNamed:@"m"];
[image drawAtPoint:]
从指定的点开始绘制
[image drawInRect:]
;绘制到指定的区域(拉伸)
[image drawAsPatternInRect :]
平铺到指定区域
通过UIColor设置view的背景图片
[UIColor colorWithPatternImge:];
裁剪图片
首先添加裁剪区域 在画图片
bitmap上下文
注意有开启 有关闭 栈模式 需要自己开启 可以在viewController中开启
UIGraphicsBeginImageContext();
开启一个图片类型的图形上下文
UIGraphicsEndImageContext();
关闭图片类型的图形上下文
bitmap画图
- 开始图片类型的图形上下文
UIGraphicsBeginImageContext();
UIGraphicsBeginImageContextWithOptions( size,(BOOL)opaque,scale Factor)
scaleFactor一般情况写0 自动适配屏幕的缩放因子
- 获取当前上下文
CGContextRef ctx = UIGraphicsGetCurrentPath();
- 路径 添加到图片类型图型上下文中
CGContextAddArc();
- 渲染
CGContextStrokePath()
- 通过图片类型的图形上下文获取图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- 关闭图片类型的图形上下
UIGraphicsEndImageContext();
将图片保存到沙盒中
- 把image对象转成data
NSData *data = UIImagePNGRrepresentation(image);
- 再通过data write to file
[data writeToFile:@"filePath" atomically :YES];
将图片保存到相册中去
UIImageWriteToSavedPhotosAlbum();