绘图第一篇 CGContextSaveGState与CGContextRestoreGState
Push a copy of the current graphics state onto the graphics state stack. Note that the path is not considered part of the graphics state, and is not saved.
说的是什么呢?意思就是说把当前的图形上下文拷贝到图形状态栈中。一个⚠️就是路径是不会被copy进去的,当然更不会被保存下来了。
CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后。
Quartz removes the graphics state that is at the top of the stack so that the most recently
saved state becomes the current graphics state.
您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回最新保存的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。简单理解就是save就是每调用一下就保存下档前的上下文,restore就是取出来当前的图形上下文。
什么时候用呢?
肯定不是你就画一个矩形,画条线的时候用,是在我们想要画比较复杂的图形,对于我们的创建的图形上下文来说,显然改图形上下文(context)的状态将会被多次改变,后面的绘制将对前面的绘制造成影响
(因为图形上下文的对象只有一个,每次通过CGContext命令的时候, 都是不断在修改图形上下文的属性,这个属性对于图形上下文来讲,就是唯一的,比如说设置线段的粗细为1,那么此刻图形上下文里 所有的线段 都是1粗细)*
对此,苹果设置一个保存图形上下文的栈,来随时存储当前你的图形上下文
通过CGContextSaveGState(context);
来保存(推入)图形上下文到栈顶
在绘制(渲染之后),通过CGContextRestoreGState(context);
来更新(将之前入栈的图形上下文状态出栈,将当前的图形上下文状态入栈)图形上下到栈顶
注意:这两个代码一般成对出现, 这样既保护了图形上下文状态的唯一性,也方便了在需要的地方修改图形上下状态
大概,就是这么个意思吧,欢迎补充指正
总结:
绘图的一般流程:
1. 获取当前的图形上下文
CGContextRef
context = UIGraphicsGetCurrentContext();
2. 保存当前图形上下文(入栈)
CGContextSaveGState(context);
3.设置上下文状态;
4.绘制(渲染);
5.更新图形上下文,也就是说拿到最新的
CGContextRestoreGState(context);