Quartz2D常用方法的简单使用

线段的绘制

方式一

    // 1.获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2.描述路径
    // 创建路径
    CGMutablePathRef path = CGPathCreateMutable();
    
    // 设置起点
    // path:给哪个路径设置起点
    CGPathMoveToPoint(path, NULL, 50, 50);
    
    // 添加一根线到某个点
    CGPathAddLineToPoint(path, NULL, 200, 200);
    
    // 3.把路径添加到上下文
    CGContextAddPath(ctx, path);
    
    // 4.渲染上下文
    CGContextStrokePath(ctx);

方式二

    //1 获取上下文
   CGContextRef context = UIGraphicsGetCurrentContext();
    
    //2 创建一个绘制的路径
    CGMutablePathRef path = CGPathCreateMutable();
    
    //画线
    //(1)设置起始点
    CGPathMoveToPoint(path, NULL, 50, 50);
    
    //(2)设置目标点
    CGPathAddLineToPoint(path, NULL, 200, 200);
    
    CGPathAddLineToPoint(path, NULL, 50, 200);
    //关闭路径和注释这句实现了一样的效果
    //    CGPathAddLineToPoint(path, NULL, 50, 50);
    
    //关闭路径(将路径封闭起来)
    CGPathCloseSubpath(path);
    
    //3 将路径添加到上下文
    CGContextAddPath(context, path);
    
    
    //4 设置上下文的属性
    //设置填充颜色
    CGContextSetRGBFillColor(context, 250/255.0, 200/255.0, 50/255.0, 1.0);
    
    //设置线条颜色
    CGContextSetRGBStrokeColor(context, 65/255.0, 170/255.0, 50/255.0, 1.0);
    //设置线条宽度
    CGContextSetLineWidth(context, 30);
    
    //设置线条转折点的样式
    CGContextSetLineJoin(context, kCGLineJoinRound);
    
    
    //5 渲染上下文
    /*渲染模式:
     kCGPathFill:填充(实心)
     kCGPathStroke:只画线(空心)
     kCGPathFillStroke:即画线又填充
     */
    //使用了设置属性进行渲染
    CGContextDrawPath(context, kCGPathFillStroke);
    
    
    //6 释放路径
    CGPathRelease(path);

方式三

    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 描述路径
    // 设置起点
    CGContextMoveToPoint(ctx, 50, 50);
    
    CGContextAddLineToPoint(ctx, 200, 200);
    
    // 渲染上下文
    CGContextStrokePath(ctx);

方式四

    //1 获取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2 添加多条线
    CGPoint p0 = {50,50};
    CGPoint p1 = {200,200};
    CGPoint p2= {50,200};
    CGPoint p3 = {50,50};
    CGPoint points[] = {p0,p1,p2,p3};
    
    CGContextAddLines(context, points, 4);
    
    
    //3 设置属性
    //---UIKit提供的设置颜色的方法--------
    //设置线条颜色
    [[UIColor redColor] setStroke];
    //设置填充颜色
    [[UIColor blueColor]setFill];
    
    //4 绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);

方式五

    
    // 贝瑟尔路径
    // 创建路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    // 设置起点
    [path moveToPoint:CGPointMake(50, 50)];
    
    // 添加一根线到某个点
    [path addLineToPoint:CGPointMake(200, 200)];
    
    // 绘制路径
    [path stroke];

方式六

    //画两根线段
    //创建贝瑟尔路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    //起点
    [path moveToPoint:CGPointMake(50, 50)];
    //终点
    [path addLineToPoint:CGPointMake(200, 200)];
    
    //线宽
    path.lineWidth = 10;
    //设置线条颜色和背景填充颜色均为红色
    [[UIColor redColor] set];
    
    [path stroke];
    
    UIBezierPath *path1 = [UIBezierPath bezierPath];
    
    [path1 moveToPoint:CGPointMake(0, 0)];
    
    [path1 addLineToPoint:CGPointMake(30, 60)];
    [[UIColor greenColor] set];
    
    path1.lineWidth = 3;
    
    [path1 stroke];

曲线的绘制

方式一

     //S型曲线
    //1 设置起始点
    CGContextMoveToPoint(context, 20, 200);
    
    //2 画贝塞尔曲线
    //(1) 3个点
    /*
    CGContextAddCurveToPoint(<#CGContextRef  _Nullable c#>, cp1x, cp1y, cp2x, cp2y, x, y)
     <#CGContextRef  _Nullable c#>:上下文
     cp1x cp1y: 第一条切线的终点
     cp2x cp2y: 第二条切线的起点
     x  y: 第二条切线的终点
     */
  CGContextAddCurveToPoint(context, 100, 20, 200, 300, 300, 50);
    //3设置属性
    [[UIColor redColor] setStroke];
  
    //4 渲染
   CGContextDrawPath(context, kCGPathStroke);

方式二

    //抛物线曲线
    // 获取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 描述路径
    // 设置起点
    CGContextMoveToPoint(ctx, 50, 50);
    
    // cpx:控制点(这里是150,20)
    CGContextAddQuadCurveToPoint(ctx, 150, 20, 250, 50);
    
    [[UIColor whiteColor]setStroke];
    
    // 渲染上下文
    CGContextStrokePath(ctx);

矩形绘制

方式一


    //----------第一种:core Graphics-----------
    //1 获取上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //2 添加矩形
   CGRect rect = CGRectMake(40, 40, 100, 200);
    CGContextAddRect(context, rect);
    
    //3 设置属性
    [[UIColor redColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    //4 绘制
    CGContextDrawPath(context, kCGPathFillStroke);

方式二

    
    //----------第二种:UIKit- 提供绘制矩形的函数  (已经封装好的)----------
    [[UIColor redColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    CGRect rect = CGRectMake(40, 40, 100, 200);
    //绘制线条矩形(空心)
  //    UIRectFrame(rect);
    
    //绘制填充的矩形(实心)
    UIRectFill(rect);

方式三

    // 圆角矩形
   UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 200, 200) cornerRadius:8];
    //注意:如果矩形为正方形,cornerRadius的值为边长的一半,就变成了圆形

    //设置线条的颜色
    [[UIColor whiteColor]setStroke];
    //设置填充颜色
    [[UIColor whiteColor]setFill];
    //渲染
    [path stroke];
    [path fill];
    

绘制圆弧、圆(椭圆)、扇形

    // 绘制圆弧
    /**
     *
     *
     *  @param context      上下文
     *  @param x#>          圆的中心点坐标x description#>
     *  @param y#>          圆的中心点坐标y description#>
     *  @param radius#>     圆的半径 description#>
     *  @param startAngle#> 开始的角度 description#>
     *  @param endAngle#>   结束的角度 description#>
     *  @param clockwise#>  画的方向 0 顺时针  1 逆时针
     */
    CGContextAddArc(context, 160, 100, 100, 0, M_PI_4, 0);
    
    //设置属性
    [[UIColor redColor]setStroke];

    //绘制
    CGContextDrawPath(context, kCGPathStroke);
    
    // 绘制扇形
    CGPoint center = CGPointMake(125, 125);
     UIBezierPath *path = [UIBezierPath 

    // Center:圆心
    // startAngle:弧度
    // clockwise:YES:顺时针 NO:逆时针
    bezierPathWithArcCenter:center radius:100 startAngle:0 endAngle:M_PI_2 clockwise:YES];
    
    // 添加一根线到圆心
    [path addLineToPoint:center];
    
    // 封闭路径,关闭路径:从路径的终点到起点
    [path closePath];
    //渲染
   [path stroke];
    

    
    
     //绘制内切圆(椭圆)

    CGRect rect = CGRectMake(50, 50, 200, 100);
    //注意:如果为正方形,则画出的是圆形;为长方形,则为椭圆
    
    //设置属性
    [[UIColor blackColor]setStroke];
    [[UIColor orangeColor]setFill];
    
    //绘制线条矩形
    //UIRectFrame(rect);
    
    //根据矩形绘制的椭圆(我这里画的是椭圆)
    CGContextAddEllipseInRect(context, rect);
    
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);

提示:绘制弧、扇形的方法可以实现本节的所有图形哦

绘制图片

方式一

    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    
    //一 UIKit提供的方法
    //1 指定一个点来绘制图片 (锚点)
    [image drawAtPoint:CGPointMake(50, 50)];
    
    //2 指定一个矩形范围来绘制 (拉伸填充)
  //    [image drawInRect:CGRectMake(0, 0, 300, 200)];
    
    //3 指定一个矩形范围平铺绘制
  //    [image drawAsPatternInRect:CGRectMake(0, 0, 300, 200)];

方式二

    
    
    //二 core graphics 提供的函数

    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage *image = [UIImage imageNamed:@"1.jpg"];
    //1 保存上下文状态
    CGContextSaveGState(context);
    
    //2 切换坐标系
    Quartz 2D的坐标系(与数学的二维坐标系一样)----->UIKit的坐标系
    //(1)向上平移一个高度
    CGContextTranslateCTM(context, 0, 200);
    //(2)改变y轴的方向 (缩放y的坐标,使其方向反转)
    CGContextScaleCTM(context, 1, -1);
    
    
    //3 图片绘制
    CGContextDrawImage(context, CGRectMake(0, 0, 300, 200), image.CGImage);
    
    //4 恢复到之前保存的上下文状态
    CGContextRestoreGState(context);

绘制文字

    // 绘制文字
    
    NSString *str = @"asfdsfsdf";
    
    
    // 文字的起点
    // Attributes:文本属性

    NSMutableDictionary *textDict = [NSMutableDictionary dictionary];

    // 设置文字颜色
    textDict[NSForegroundColorAttributeName] = [UIColor redColor];

    // 设置文字字体
    textDict[NSFontAttributeName] = [UIFont systemFontOfSize:30];

    // 设置文字的空心颜色和宽度

    textDict[NSStrokeWidthAttributeName] = @3;

    textDict[NSStrokeColorAttributeName] = [UIColor yellowColor];

    // 创建阴影对象
    NSShadow *shadow = [[NSShadow alloc] init];
    shadow.shadowColor = [UIColor greenColor];
    shadow.shadowOffset = CGSizeMake(4, 4);
    shadow.shadowBlurRadius = 3;
    textDict[NSShadowAttributeName] = shadow;

    // 富文本:给普通的文字添加颜色,字体大小
    [str drawAtPoint:CGPointZero withAttributes:textDict];
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 路径定义一个或多个形状或子路径。 子路径可以由直线,曲线或两者组成。 它可以打开或关闭。 子路径可以是简单的形状,...
    权宜平和阅读 799评论 0 1
  • 本文转载自:http://southpeak.github.io/2014/11/16/quartz2d-3/ 路...
    idiot_lin阅读 440评论 0 0
  • 18- UIBezierPath官方API中文翻译(待校对) ----------------- 华丽的分割线 -...
    醉卧栏杆听雨声阅读 1,034评论 1 1
  • Quartz2D以及drawRect的重绘机制字数1487 阅读21 评论1 喜欢1一、什么是Quartz2D Q...
    PurpleWind阅读 752评论 0 3
  • 其实今天应该去参加学校的演讲会的,可惜有事不能参与,本以为会有许多家长参与,可听去的家长说去的很少,于老师可能还被...
    王柯妈妈阅读 151评论 0 0