绘图
2.Quartz 2D ApI 是Core Graphics框架(在导入<UIKit/UIKit.h>已经导入了)的部分,因此其中的很多数据类型和方法都是以CG开头;
3.Quartz 2D 与分辨率
和设备无关,因此在使用Quartz 2D 画图时,无需考虑最终绘图的目标设备;
4.Quartz 2D 的坐标系统的原点(0
,0)在左下角;有些技术在设置他们的图形上下问的时候,使用了不同于Quartz的默认坐标系统。例如
:UIView中的UIGraphicsGetCurrentContext方法返回的图形上下文就是用的是原点位于左上角的坐标系;以UI开头的方法获取到的,在绘图时无需进行坐标转换(都是以左上角开始的);
5.使用含有“Creact”或“copy”的函数创建的对象,使用完后必须释放,否则会内存泄露;
6.UIView重新绘图的时候应该调用setNeedsDisplay,而不能直接调用drawRect;
——————————————绘制图形
1.//自定义绘制图形,调用drawRect方法
- (
void
)drawRect:(
CGRect
)rect{
//在这个方法中需要拿到图形的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//然后调用下面的方法
}
#pragma mark - 绘制线条
- (void)drawLine:(CGContextRef)context
{
//1.获取上下文
//context
//2.创建绘制的路径(path)
//路径
//CGPathRef 不可变
//CGMutablePathRef 可变路径
CGMutablePathRef path = CGPathCreateMutable();
//设置起始点
CGPathMoveToPoint(path, NULL, 50, 50);
//连线到下一点
CGPathAddLineToPoint(path, NULL, 200, 200);
CGPathAddLineToPoint(path, NULL, 50, 200);
//关闭路径
CGPathCloseSubpath(path);
//3.把路径添加到上下文中
CGContextAddPath(context, path);
//4.设置上下文的属性
//线条的颜色
CGContextSetRGBStrokeColor(context, 41/255.0, 110/255.0, 222/255.0, 1);
//填充的颜色
CGContextSetRGBFillColor(context, 150/255.0, 50/255.0, 100/255.0, 1);
//线条宽度
CGContextSetLineWidth(context, 5);
//连接点的样式
CGContextSetLineJoin(context, kCGLineJoinRound);
//5.绘制路径
/*
kCGPathFill, //只填充
kCGPathEOFill, //异或
kCGPathStroke, //只画线
kCGPathFillStroke, //填充和画线
kCGPathEOFillStroke
*/
CGContextDrawPath(context, kCGPathFillStroke);
//6.释放路径
CGPathRelease(path);
}
- (void)drawLine:(CGContextRef)context
{
//1.获取上下文
//context
//2.创建绘制的路径(path)
//路径
//CGPathRef 不可变
//CGMutablePathRef 可变路径
CGMutablePathRef path = CGPathCreateMutable();
//设置起始点
CGPathMoveToPoint(path, NULL, 50, 50);
//连线到下一点
CGPathAddLineToPoint(path, NULL, 200, 200);
CGPathAddLineToPoint(path, NULL, 50, 200);
//关闭路径
CGPathCloseSubpath(path);
//3.把路径添加到上下文中
CGContextAddPath(context, path);
//4.设置上下文的属性
//线条的颜色
CGContextSetRGBStrokeColor(context, 41/255.0, 110/255.0, 222/255.0, 1);
//填充的颜色
CGContextSetRGBFillColor(context, 150/255.0, 50/255.0, 100/255.0, 1);
//线条宽度
CGContextSetLineWidth(context, 5);
//连接点的样式
CGContextSetLineJoin(context, kCGLineJoinRound);
//5.绘制路径
/*
kCGPathFill, //只填充
kCGPathEOFill, //异或
kCGPathStroke, //只画线
kCGPathFillStroke, //填充和画线
kCGPathEOFillStroke
*/
CGContextDrawPath(context, kCGPathFillStroke);
//6.释放路径
CGPathRelease(path);
}
划线的第二种方法
- (void)drawLine2:(CGContextRef)context
{
//设置点
CGPoint p1 = CGPointMake(50, 50);
CGPoint p2 = CGPointMake(200, 150);
CGPoint p3 = CGPointMake(50, 100);
// int i[2] = {}
CGPoint points[] = {p1, p2, p3};
//把点直接在上下文上连线
CGContextAddLines(context, points, 3);
//UIKit封装的设置颜色的方法
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
[[UIColor whiteColor] set];
//绘制图形
CGContextDrawPath(context, kCGPathFillStroke);
}
{
//设置点
CGPoint p1 = CGPointMake(50, 50);
CGPoint p2 = CGPointMake(200, 150);
CGPoint p3 = CGPointMake(50, 100);
// int i[2] = {}
CGPoint points[] = {p1, p2, p3};
//把点直接在上下文上连线
CGContextAddLines(context, points, 3);
//UIKit封装的设置颜色的方法
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
[[UIColor whiteColor] set];
//绘制图形
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 绘制矩形
- (void)drawShapeRect:(CGContextRef)context
{
//方法一
/*
//设置绘制的区域
CGRect rect = CGRectMake(40, 40, 100, 200);
//设置区域添加到上下文
CGContextAddRect(context, rect);
//UIKit封装的设置颜色的方法
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
*/
//方法二
//UIKit
CGRect rect = CGRectMake(40, 40, 100, 200);
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
//调用,直接开始绘图
UIRectFill(rect); //填充
UIRectFrame(rect); //框架
}
- (void)drawShapeRect:(CGContextRef)context
{
//方法一
/*
//设置绘制的区域
CGRect rect = CGRectMake(40, 40, 100, 200);
//设置区域添加到上下文
CGContextAddRect(context, rect);
//UIKit封装的设置颜色的方法
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
*/
//方法二
//UIKit
CGRect rect = CGRectMake(40, 40, 100, 200);
[[UIColor redColor] setStroke];
[[UIColor blueColor] setFill];
//调用,直接开始绘图
UIRectFill(rect); //填充
UIRectFrame(rect); //框架
}
#pragma mark - 绘制圆形
- (void)drawCircle:(CGContextRef)context
{
//圆
/*
* x,y 圆心
* radius 半径
* startAngle endAngle 起始和结束的角度(单位 弧度)
* clockwise 顺时针 0 / 逆时针 1
*/
//CGContextAddArc(context, 160, 200, 50, 0, M_PI_2, 1);
//内切圆
CGRect rect = CGRectMake(50, 50, 200, 100);
[[UIColor orangeColor] setStroke];
UIRectFrame(rect);
CGContextAddEllipseInRect(context, CGRectMake(50, 50, 200, 100));
[[UIColor redColor] setStroke];
[[UIColor brownColor] setFill];
CGContextDrawPath(context, kCGPathFillStroke);
}
- (void)drawCircle:(CGContextRef)context
{
//圆
/*
* x,y 圆心
* radius 半径
* startAngle endAngle 起始和结束的角度(单位 弧度)
* clockwise 顺时针 0 / 逆时针 1
*/
//CGContextAddArc(context, 160, 200, 50, 0, M_PI_2, 1);
//内切圆
CGRect rect = CGRectMake(50, 50, 200, 100);
[[UIColor orangeColor] setStroke];
UIRectFrame(rect);
CGContextAddEllipseInRect(context, CGRectMake(50, 50, 200, 100));
[[UIColor redColor] setStroke];
[[UIColor brownColor] setFill];
CGContextDrawPath(context, kCGPathFillStroke);
}
#pragma mark - 贝塞尔曲线
- (void)drawCurve:(CGContextRef)context
{
//起始点
CGContextMoveToPoint(context, 20, 50);
/*
* 1x, 1y 第一条切线的终点
* 2x, 2y 第二条切线的起始点
* x, y 第二条切线的终点
*/
// CGContextAddCurveToPoint(context, 100, 20, 200, 300, 300, 50);
CGContextAddQuadCurveToPoint(context, 160, 20, 300, 200);
CGContextDrawPath(context, kCGPathStroke);
}
#pragma mark - 绘制文本
- (void)drawText:(CGContextRef)context
{
//1.绘制的文字
NSString *str = @"wxhl34";
//2.定义绘制的区域
CGRect rect = CGRectMake(50, 50, 200, 50);
UIRectFrame(rect);
//3.设置绘制的样式
//文本段落的样式
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
//断行方式
style.lineBreakMode = NSLineBreakByCharWrapping;
style.alignment = NSTextAlignmentRight;
NSDictionary *attr = @{
NSFontAttributeName:[UIFont systemFontOfSize:20],
NSParagraphStyleAttributeName:style
};
//4.绘制
[str drawInRect:rect withAttributes:attr];
}
- (void)drawCurve:(CGContextRef)context
{
//起始点
CGContextMoveToPoint(context, 20, 50);
/*
* 1x, 1y 第一条切线的终点
* 2x, 2y 第二条切线的起始点
* x, y 第二条切线的终点
*/
// CGContextAddCurveToPoint(context, 100, 20, 200, 300, 300, 50);
CGContextAddQuadCurveToPoint(context, 160, 20, 300, 200);
CGContextDrawPath(context, kCGPathStroke);
}
#pragma mark - 绘制文本
- (void)drawText:(CGContextRef)context
{
//1.绘制的文字
NSString *str = @"wxhl34";
//2.定义绘制的区域
CGRect rect = CGRectMake(50, 50, 200, 50);
UIRectFrame(rect);
//3.设置绘制的样式
//文本段落的样式
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
//断行方式
style.lineBreakMode = NSLineBreakByCharWrapping;
style.alignment = NSTextAlignmentRight;
NSDictionary *attr = @{
NSFontAttributeName:[UIFont systemFontOfSize:20],
NSParagraphStyleAttributeName:style
};
//4.绘制
[str drawInRect:rect withAttributes:attr];
}
#pragma mark - 绘制图片
- (void)drawImage:(CGContextRef)context
{
//图片
UIImage *image = [UIImage imageNamed:@"baymax.jpg"];
//1.以指定点为起点绘制
[image drawAtPoint:CGPointMake(20, 400)];
//2.在指定区域绘制,会自动拉伸
//[image drawInRect:CGRectMake(0, 0, 100, 200)];
//坐标系转换
//CG UIKit
//保存当前的上下文
CGContextSaveGState(context);
//CGContextTranslateCTM(context, 0, 200);
//y轴取反
CGContextScaleCTM(context, 1, -1);
//y轴上移200
CGContextTranslateCTM(context, 0, -200);
/*
CGContextRotateCTM(context, M_PI); //旋转
CGContextScaleCTM(context, -1, 1); //缩放
CGContextTranslateCTM(context, 0, -200); //平移
*/
//CG
//UIImage --> CGImageRef
//UIKit Core Graphics AppKit
CGContextDrawImage(context, CGRectMake(0, 0, 320, 200), image.CGImage);
//恢复之前保存的上下文
CGContextRestoreGState(context);
}
- (void)drawImage:(CGContextRef)context
{
//图片
UIImage *image = [UIImage imageNamed:@"baymax.jpg"];
//1.以指定点为起点绘制
[image drawAtPoint:CGPointMake(20, 400)];
//2.在指定区域绘制,会自动拉伸
//[image drawInRect:CGRectMake(0, 0, 100, 200)];
//坐标系转换
//CG UIKit
//保存当前的上下文
CGContextSaveGState(context);
//CGContextTranslateCTM(context, 0, 200);
//y轴取反
CGContextScaleCTM(context, 1, -1);
//y轴上移200
CGContextTranslateCTM(context, 0, -200);
/*
CGContextRotateCTM(context, M_PI); //旋转
CGContextScaleCTM(context, -1, 1); //缩放
CGContextTranslateCTM(context, 0, -200); //平移
*/
//CG
//UIImage --> CGImageRef
//UIKit Core Graphics AppKit
CGContextDrawImage(context, CGRectMake(0, 0, 320, 200), image.CGImage);
//恢复之前保存的上下文
CGContextRestoreGState(context);
}
//设置水印的demo
- (UIImage *)watermarkImageWithText:(NSString *)text
{
//1.取到上下文
UIGraphicsBeginImageContext(self.size);
//2.绘制图片
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
//3.绘制水印文字
CGRect textRect = CGRectMake(0, self.size.height - 30, self.size.width, 30);
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
style.alignment = NSTextAlignmentCenter;
NSDictionary *attr = @{
NSFontAttributeName: [UIFont boldSystemFontOfSize:25],
NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName: [UIColor whiteColor]
};
// [[UIColor whiteColor] set];
[text drawInRect:textRect withAttributes:attr];
//4.获取到绘制完成的图片
UIImage *watermarkedImage = UIGraphicsGetImageFromCurrentImageContext();
//5.结束在图片上的绘制
UIGraphicsEndImageContext();
return watermarkedImage;
}
{
//1.取到上下文
UIGraphicsBeginImageContext(self.size);
//2.绘制图片
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
//3.绘制水印文字
CGRect textRect = CGRectMake(0, self.size.height - 30, self.size.width, 30);
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle defaultParagraphStyle]mutableCopy];
style.alignment = NSTextAlignmentCenter;
NSDictionary *attr = @{
NSFontAttributeName: [UIFont boldSystemFontOfSize:25],
NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName: [UIColor whiteColor]
};
// [[UIColor whiteColor] set];
[text drawInRect:textRect withAttributes:attr];
//4.获取到绘制完成的图片
UIImage *watermarkedImage = UIGraphicsGetImageFromCurrentImageContext();
//5.结束在图片上的绘制
UIGraphicsEndImageContext();
return watermarkedImage;
}