本文共 5156 字,大约阅读时间需要 17 分钟。
基本步骤:
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转载地址:http://rjsni.baihongyu.com/