使用Quartz时涉及到一个图形上下文,其中图形上下文中包含一个保存过的图形状态堆栈。在Quartz创建图形上下文时,该堆栈是空的。CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。

UIGraphicsBeginImageContextWithOptions(targetRect.size, YES, 0.0);CGContextRef context = UIGraphicsGetCurrentContext();float myFillColor[] = {1,0,0,1}; //red;CGContextSaveGState(context);CGContextSetRGBFillColor(context, 0,1,1,1);CGContextFillRect(context, targetRect);CGContextSetFillColor(context, myFillColor);CGContextFillEllipseInRect(context, targetRect);CGContextFillPath(context);CGContextRestoreGState(context);UIImage *uiImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();

在实际的绘图过程中,对于CGContextRestoreGState() 的作用.通过查阅诸多文章, 
我是这么理解的,

首先,来总结下绘图的基本流程 
1.获得图形上下文:

 let context = UIGraphicsGetCurrentContext();
  • 1

2.设置图形上下文属性:(比如线条的起点,终点 ,线条的width ,线条的color 等等)

CGContextSetLineWidth(context, 20);CGContextMoveToPoint(context, 282, 298);
  • 1
  • 2

3.绘制(渲染)设置好的图形上下文状态;

CGContextStrokePath(context);
  • 1

以上,就是基本绘图流程,如果你只是在一个view上, 只画一条线段, 
或者只画一个圆, 那么这个流程也就没有问题,对于图形上下文来说,也只进行一次操作,

但是问题是,如果我们想要画比较复杂的图形,对于我们的创建的图形上下文来说,显然改图形上下文(context)的状态将会被多次改变,后面的绘制将对前面的绘制造成影响~~ 
(因为图形上下文的对象只有一个,每次通过CGCOntext命令的时候, 都是不断在修改图形上下文的属性,这个属性对于图形上下文来讲,就是唯一的,比如说设置线段的粗细为1,那么此刻图形上下文里 所有的线段 都是1粗细)*

对此,苹果设置一个保存图形上下文的栈,来随时存储当前你的图形上下文(个人感觉有点像NSUserdefault,) 
通过

CGContextSaveGState(context);
  • 1

来保存(推入)图形上下文到栈顶

在绘制(渲染之后),通过

CGContextRestoreGState(context);
  • 1

来更新(将之前入栈的图形上下文状态出栈,将当前的图形上下文状态入栈)图形上下到栈顶

注意:这两个代码一般成对出现, 这样既保护了图形上下文状态的唯一性,也方便了在需要的地方修改图形上下状态

大概,就是这么个意思吧,欢迎补充指正

总结: 
绘图的一般流程补完:


1. 获得图形上下文(let context = UIGraphicsGetCurrentContext();) 
2.CGContextSaveGState(context); //保存当前图形上下文(入栈) 
3.设置上下文状态; 
4.绘制(渲染); 
5.CGContextRestoreGState(context); //跟新图形上下文()

CGContextSaveGState与CGContextRestoreGState的作用相关推荐

  1. IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)...

    本文转载自:http://blog.csdn.net/rhljiayou/article/details/9919713 首先了解一下CGContextRef: An opaque type that ...

  2. IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)

    本文转载自:http://blog.csdn.net/rhljiayou/article/details/9919713 首先了解一下CGContextRef: An opaque type that ...

  3. IOS开发—IOS绘制圆,直线,弧线,矩形,扇形,三角形,贝塞尔等图形

    一.绘制圆,直线,弧线,矩形,扇形,三角形,贝塞尔等图形 //一个不透明类型的Quartz 2D绘画环境,相当于一个画布,你可以在上面任意绘画CGContextRef context = UIGrap ...

  4. IOS绘制圆,直线,弧线,矩形,扇形,三角形,贝塞尔等图形

    首先了解一下CGContextRef: An opaque type that represents a Quartz 2D drawing environment. Graphics Context ...

  5. Quartz 2d绘图

    今天看了一下Quartz 2D绘图,我只想说:不要把绘图和动画那些东西当做一个很复杂的东西,其实只要你认真看还是可以理解的.他们并不难.啰嗦了几句,现在直接进入正题: 前提是我们必须新建一个singl ...

  6. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  7. iOS 图形处理 Core Graphics Quartz2D 教程

    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...

  8. iOS图形编辑之Core Graphics

    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...

  9. ios绘图教程(原文http://www.cocoachina.com/industry/20140115/7703.html)

    os开发者平台 Cocos引擎中文官网 H5小游戏编辑器 退出chengtanze 首页 资讯 问答 论坛 Cocos2d-x 开发者中心 新手入门 专题 新闻日历 开发者通道 排行榜 代码库 图书库 ...

最新文章

  1. 物理如何证明上帝的存在?
  2. MFC文件操作大全,打开,保存,复制,删除,查找等
  3. 永洪报表工具_该怎么选BI工具
  4. Haproxy 管控台介绍
  5. Crash的数字表格(HYSBZ-2154)
  6. 迟思堂工作室编程规范:单片机C语言
  7. 数据结构与算法小结——排序(八)
  8. [Regionals 2012 :: Asia - Tokyo ]
  9. 如何对QQ好友的IP地址进行精准定位
  10. 房友软件注册码暴力输入程序
  11. 设计原则:单一职责(SRP)原则
  12. Python -运用for语句输出(九九乘法表)
  13. Mac创建txt文件的两种方法
  14. (CVPR 2022 阅读笔记)Residual Local Feature Network for Efficient Super-Resolution
  15. windows格式转换命令convert详解
  16. 李洪超 硬件工程师_听说你想做功能安全工程师?(下篇)
  17. 自学java不能不知道的网站----how2j
  18. 揭开ESP8266神秘的面纱
  19. UE4 如何防止overlap事件调用两次
  20. Flutter - Mac m1和Windows10配置flutter环境 ,iOS原生项目接入flutter

热门文章

  1. R语言ggplot2可视化NHANES数据集年龄和身高的关系并按照性别因子分析男性和女性的差异
  2. pandas使用str函数和contains函数查看dataframe特定数据列中是否匹配或包含特定模式的字符串(match or contain a pattern in column value)
  3. pandas使用groupby函数按照多个分组变量进行分组聚合统计、使用agg函数计算分组的多个统计指标(grouping by multiple columns in dataframe)
  4. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(单色填充、分组颜色填充)实战
  5. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色配置)实战
  6. R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)
  7. pandas读写结构化数据(read_csv,read_table, read_excel, read_html, read_sql)
  8. 关联规则概念、啤酒加尿布引出购物篮分析、频繁项集、支持度+置信度+提升度
  9. 深度学习之反向传播算法
  10. makefile:2: *** missing separator. Stop. make 之后出现的错误,解决方法