您的位置:首页 > 其它

Quartz 2D基本图形的绘制

2016-01-14 15:41 309 查看
基本步骤:

1.获取绘图上下文

2.创建并设置路径

3.将路径添加到上下文

4.设置上下文状态

5.绘制路径

6.释放路径

#import "YGView.h"

//屏幕尺寸

#define kScreenSize [UIScreen mainScreen].bounds.size

//屏幕宽高定义

#define kscreenWidth [[UIScreen mainScreen] bounds].size.width

#define kScreenHeight [[UIScreen mainScreen] bounds].size.height

@implementation YGView

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

// Drawing code

CGContextRef context=UIGraphicsGetCurrentContext();

// [self drawLine1:context];

// [self drawLine2:context];

// [self drawArc:context];

// [self drawCurve:context];

// [self drawImage:context];

// [self drawImageChangeContext:context];

[self drawImage1:context];

}

-(void)drawLine1:(CGContextRef)context{

CGMutablePathRef path=CGPathCreateMutable();

CGPathMoveToPoint(path, nil, 20, 50);//移动到指定位置(设置路径起点)

CGPathAddLineToPoint(path, nil, 20, 100);//绘制直线(从起始位置开始)

CGPathAddLineToPoint(path, nil, 200, 100);//绘制另一条直线(从上一条直线的终点开始)

CGContextAddPath(context, path);

CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);//设置直线颜色

CGContextSetRGBFillColor(context, 0, 1.0, 0, 1);//设置填充颜色

CGContextSetLineWidth(context, 2.0);//设置直线宽度

CGContextSetLineCap(context, kCGLineCapRound);//设置顶点样式

CGContextSetLineJoin(context, kCGLineJoinRound);//设置连接点样式

CGFloat lengths[2]={18,9};

CGContextSetLineDash(context, 0, lengths, 2);

CGContextDrawPath(context, kCGPathFillStroke);//最后一个参数是填充类型

/*CGPathDrawingMode是填充方式,枚举类型

kCGPathFill:只有填充(非零缠绕数填充),不绘制边框

kCGPathEOFill:奇偶规则填充(多条路径交叉时,奇数交叉填充,偶交叉不填充)

kCGPathStroke:只有边框

kCGPathFillStroke:既有边框又有填充

kCGPathEOFillStroke:奇偶填充并绘制边框

*/

CGPathRelease(path);

}

-(void)drawLine2:(CGContextRef)context{

CGContextMoveToPoint(context, 20, 150);

CGContextAddLineToPoint(context, 20, 200);

CGContextAddLineToPoint(context, 200, 200);

//封闭路径

CGContextClosePath(context);

[[UIColor redColor] setStroke];//设置红色边框

[[UIColor greenColor] setFill];//设置填充颜色

//[[UIColor blueColor]set];//同时设置填充和边框色

CGContextDrawPath(context, kCGPathFillStroke);

}

#pragma mark 绘制矩形

-(void)drawRectWithContext:(CGContextRef)context{

//添加矩形对象

CGRect rect=CGRectMake(20, 50, 280.0, 50.0);

CGContextAddRect(context,rect);

//设置属性

[[UIColor blueColor]set];

//绘制

CGContextDrawPath(context, kCGPathFillStroke);

}

#pragma mark - 绘制椭圆

-(void)drawEllipse:(CGContextRef)context{

CGRect rect=CGRectMake(50, 50, 220, 200);

CGContextAddEllipseInRect(context, rect);

//设置属性

[[UIColor greenColor] set];

//绘制

CGContextDrawPath(context, kCGPathFillStroke);

}

#pragma mark - 绘制弧线

-(void)drawArc:(CGContextRef)context{

// CGContextAddArc(CGContextRef _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)

/* 添加弧线对象

x:中心点x坐标

y:中心点y坐标

radius:半径

startAngle:起始弧度

endAngle:终止弧度

clockwise:是否逆时针绘制,0为顺时针绘制

*/

CGContextAddArc(context, 160, 160, 100, 0, M_PI*0.2, 0);

//设置属性

[[UIColor redColor] setStroke];

[[UIColor yellowColor] setFill];

//绘制

CGContextDrawPath(context, kCGPathFillStroke);

}

#pragma mark - 绘制贝塞尔曲线

-(void)drawCurve:(CGContextRef)context{

CGContextMoveToPoint(context, 20, 100);

// CGContextAddQuadCurveToPoint(CGContextRef _Nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)

/*绘制二次贝塞尔曲线

c:图形上下文

cpx:控制点x坐标

cpy:控制点y坐标

x:结束点x坐标

y:结束点y坐标

*/

CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100);

CGContextMoveToPoint(context, 20, 500);

// CGContextAddCurveToPoint(CGContextRef _Nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)

/*绘制三次贝塞尔曲线

c:图形上下文

cp1x:第一个控制点x坐标

cp1y:第一个控制点y坐标

cp2x:第二个控制点x坐标

cp2y:第二个控制点y坐标

x:结束点x坐标

y:结束点y坐标

*/

CGContextAddCurveToPoint(context, 80, 300, 240, 500, 300, 300);

//设置图形上下文属性

[[UIColor yellowColor]setFill];

[[UIColor redColor]setStroke];

//绘制路径

CGContextDrawPath(context, kCGPathFillStroke);

}

#pragma mark - 图像绘制

-(void)drawImage:(CGContextRef)context{

UIImage *image=[UIImage imageNamed:@"test1"];

//从某一点开始绘制

// [image drawAtPoint:CGPointMake(10, 50)];

//绘制到指定的矩形中,注意如果大小不合适会会进行拉伸

[image drawInRect:CGRectMake(20, 20, 300, 300)];

//平铺绘制

// [image drawAsPatternInRect:CGRectMake(20, 20, 300, 300)];

}

#pragma mark - 图形上下文变换

-(void)drawImageChangeContext:(CGContextRef)context{

//保存初始状态

CGContextSaveGState(context);

//1.图形上下文向右平移40

CGContextTranslateCTM(context, 60, 40);

//2.缩放0.5

CGContextScaleCTM(context, 0.5, 0.5);

//3.旋转

CGContextRotateCTM(context, M_PI_4/4);

UIImage *image=[UIImage imageNamed:@"test1"];

[image drawInRect:CGRectMake(20, 50, 300, 300)];

//恢复到初始化状态

CGContextRestoreGState(context);

}

#pragma mark - 使用Core Graphics绘制图像

-(void)drawImage1:(CGContextRef)context{

// UIImage *image=[UIImage imageNamed:@"test1"];

// //图像绘制

// CGRect rect=CGRectMake(20, 50, 300, 300);

// CGContextDrawImage(context, rect, image.CGImage);

// ///////////////////////////////////以上代码图像会倒过来

UIImage *image=[UIImage imageNamed:@"test1"];

CGContextSaveGState(context);

CGFloat height=300,y=50;

//上下文形变

CGContextScaleCTM(context, 1, -1);//在Y轴缩放-1相当于沿着X轴旋转180度;注意不要沿着z轴旋转,这样得不到想要的结果

CGContextTranslateCTM(context, 0, -(kScreenHeight-(kScreenHeight-height-2*y)));//向上平移

//图像绘制

CGRect rect=CGRectMake(10, y, 300, height);

CGContextDrawImage(context, rect, image.CGImage);

CGContextRestoreGState(context);

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: