Quartz2D_Day2_图形上下文栈

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

- (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);   
}
Quartz2D_Day2_图形上下文栈_第1张图片
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_图形上下文栈)