美文网首页
Quartz2D_Day2_图形上下文栈

Quartz2D_Day2_图形上下文栈

作者: MR_詹 | 来源:发表于2016-12-01 11:04 被阅读8次

    原文此文提出一个新的名称:图形上下文栈,这个名称能更好的解析绘图的工作流程。接下来先看代码:绘制两条不一样的线条

    - (void)drawRect:(CGRect)rect
    {
        //获取上下文
        CGContextRef ctx=UIGraphicsGetCurrentContext();
        //绘图
        //第一条线
        CGContextMoveToPoint(ctx, 20, 100);
        CGContextAddLineToPoint(ctx, 100, 320);
        
        //设置第一条线的状态
        //设置线条的宽度
        CGContextSetLineWidth(ctx, 12);
        //设置线条的颜色
        [[UIColor brownColor]set];
        //设置线条两端的样式为圆角
        CGContextSetLineCap(ctx,kCGLineCapRound);
        //对线条进行渲染
        CGContextStrokePath(ctx);
        
        //第二条线
        CGContextMoveToPoint(ctx, 40, 200);
        CGContextAddLineToPoint(ctx, 80, 100);
        
        //清空状态
        CGContextSetLineWidth(ctx, 1);
        [[UIColor blackColor]set];
        CGContextSetLineCap(ctx,kCGLineCapButt);
        
        //渲染
        CGContextStrokePath(ctx);   
    }
    
    Paste_Image.png

    图形上下文有一个栈存放三种绘图信息:
    1、图形信息
    2、图形的状态
    3、图形的绘制
    以上面绘制两条线为例,绘制了第一条线,当绘制的第二条线的(1,2,3)有不同的地方就需要重新设置,否则就根据第一条设置的信息绘制。

    这里有一个新的方法,获取当前图形上下文信息并保存,以备第二次使用当前的图形上下文信息,需要注意的是,调用这个方法保存一次,就只能使用一次,否则会出现野指针调用而挂掉。

    //保存
    CGContextSaveGState(ctx);
    //使用
    CGContextRestoreGState(ctx);
    

    完整代码:

    - (void)drawRect:(CGRect)rect
    {
        //获取上下文
        CGContextRef ctx=UIGraphicsGetCurrentContext();
        //保存一份最初的图形上下文
        CGContextSaveGState(ctx);
        
        //绘图
        //第一条线
        CGContextMoveToPoint(ctx, 20, 100);
        CGContextAddLineToPoint(ctx, 100, 320);
        
        //设置第一条线的状态
        //设置线条的宽度
        CGContextSetLineWidth(ctx, 12);
        //设置线条的颜色
        [[UIColor brownColor]set];
        //设置线条两端的样式为圆角
        CGContextSetLineCap(ctx,kCGLineCapRound);
        //对线条进行渲染
        CGContextStrokePath(ctx);
        
        //还原开始的时候保存的那份最纯洁的图形上下文
        CGContextRestoreGState(ctx);
        //第二条线
        CGContextMoveToPoint(ctx, 40, 200);
        CGContextAddLineToPoint(ctx, 80, 100);
        
        //清空状态
    //    CGContextSetLineWidth(ctx, 1);
    //    [[UIColor blackColor]set];
    //    CGContextSetLineCap(ctx,kCGLineCapButt);
        
        //渲染
        CGContextStrokePath(ctx);
    }
    

    相关文章

      网友评论

          本文标题:Quartz2D_Day2_图形上下文栈

          本文链接:https://www.haomeiwen.com/subject/tkjxmttx.html