图形上下文栈

作者: mkb2 | 来源:发表于2016-08-07 13:12 被阅读0次

看了几篇网上图形上下文栈的讲解,不知道是我理解有问题,还是没找到好文章,还是压根作者也不是特别明白,欺骗我。最后决定自己写一个demo,好好理解一下


什么是图像上下文栈?
我的理解就是,保存当前的上下文样式,当需要的时候直接还原,不用一直写垃圾代码

将来要做的样式和代码解释图
- (void)drawRect:(CGRect)rect {
    //图形上下文栈
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //第一根线,头部是圆角,线是红色的,线宽10px
    CGContextMoveToPoint(ctx, 10, 10);
    CGContextAddLineToPoint(ctx, 10, 90);
    CGContextSetLineCap(ctx, kCGLineCapRound);
    CGContextSetLineWidth(ctx, 4);
    [[UIColor redColor] set];
    //保存第一个图形上下文样式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    //第2根线,头部是直角,线是绿色的,线宽10px
    CGContextMoveToPoint(ctx, 30, 10);
    CGContextAddLineToPoint(ctx, 30, 43);
    CGContextSetLineWidth(ctx, 12);
    CGContextSetLineCap(ctx, kCGLineCapButt);
    [[UIColor greenColor] set];
    //保存第二个图形上下文样式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    
    //第3根线,头部是kCGLineCapSquare,线是橙色的,线宽20px
    CGContextMoveToPoint(ctx, 60, 40);
    CGContextAddLineToPoint(ctx, 40, 180);
    CGContextSetLineWidth(ctx, 4);
    CGContextSetLineCap(ctx, kCGLineCapSquare);
    [[UIColor orangeColor] set];
    //保存第三个图形上下文样式
    CGContextSaveGState(ctx);
    CGContextStrokePath(ctx);
    
    //直接绘制一个直线,看看是什么样子的(其实是和第三个样式相同)
    CGContextMoveToPoint(ctx, 90, 10);
    CGContextAddLineToPoint(ctx, 90, 99);
    CGContextStrokePath(ctx);
    
    //从图像上下文中获取一个数据试试
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 120, 10);
    CGContextAddLineToPoint(ctx, 120, 130);
    CGContextStrokePath(ctx);
    
    //突然想绘制第四个线,和第一根线一样
    CGContextMoveToPoint(ctx, 140, 10);
    CGContextAddLineToPoint(ctx, 140, 99);
    CGContextStrokePath(ctx);
    
    //突然想绘制一个圆形,和第一根线的属性基本一致
    //即使使用一个图形上下文,也不影响使用属性和绘制多个图形
    CGContextAddArc(ctx, 200, 60, 20, 0, 189/360.0*2*M_PI, NO);
    CGContextStrokePath(ctx);
    
    //从图形上下文栈中在获取一个试试
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 250, 10);
    CGContextAddLineToPoint(ctx, 250, 100);
    CGContextStrokePath(ctx);
    
![Uploading Simulator Screen Shot 2016年8月7日 下午12.55.32_489724.png . . .]
    //再去从图形上下文栈中在获取一个
    CGContextRestoreGState(ctx);
    CGContextMoveToPoint(ctx, 300, 10);
    CGContextAddLineToPoint(ctx, 300, 100);
    CGContextStrokePath(ctx);
    
}

注意:
1.入栈CGContextSaveGState(cox)
2.出栈CGContextRestoreGState(ctx);
3.如果出战的次数大于入栈,就会奔溃
4.什么是入栈?就是拷贝当前图形上下文,然后放到栈中,因为使用CGContextRef只有一个图形上下文,所以要拷贝!
5.如何理解拷贝图形上下文,我们操作的图形上下文成为A,此时如果图形上下文就设置了[[UIColor redColor] set]这一个属性,拷贝A,入栈(我们把拷贝后入栈的成为B),将来不论以后我们如何操作A,设置了多少属性,以后的都是A这个模样,但是我们出战B,将来使用的样式都是只有一个[[UIColor redColor] set]的状态!说白了,就是保存某种图形上下文的状态!
5.出战的上下文,将样式赋值给当前样式,然后释放

相关文章

  • 图形上下文状态栈与矩阵操作

    图形上下文状态栈与矩阵操作 矩阵操作(关注核心代码即可) 图形上下文状态栈(关注核心代码即可)

  • 图形上下文栈

    绘图的完整过程 程序启动,显示自定义的view。当程序第一次显示在我们眼前的时候,程序会调用drawRect:方法...

  • 图形上下文栈

    看了几篇网上图形上下文栈的讲解,不知道是我理解有问题,还是没找到好文章,还是压根作者也不是特别明白,欺骗我。最后决...

  • 图形上下文栈

    保存图形上下文状态: CGContextSaveGstate: 恢复图形上下文状态: CGContextResto...

  • 图形上下文状态栈、矩阵操作

    图形上下文状态栈:用来保存绘图的状态(颜色,线宽等等)。1、首先开启一个图形上下文2、开启一个路径设置起始点3、设...

  • 浅析图形上下文栈

    效果图: 主要代码 主要原理图:

  • Quartz2D----图形上下文

    图形上下文 1. 图形上下文概述 图形上下文(Graphics Context)是什么?是一个CGContextR...

  • CoreGraphics

    图形上下文 Core Graphics 使用图形上下文进行工作,这个上下文的作用像画家的画布一样。在图形上下文之外...

  • CGContextSaveGState和CGContextRes

    使用Quartz时涉及到一个图形上下文,其中图形上下文中包含一个保存过的图形状态堆栈。在Quartz创建图形上下文...

  • iOS 圆角图片

    // 开启图形上下文 // 剪裁 //绘制图片 // 从上下文中获取剪裁好的图片 // 关闭图形上下文

网友评论

    本文标题:图形上下文栈

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