CGContextSaveGState与CGContextRestoreGState详解

本文介绍了使用CGContextSaveGState与CGContextRestoreGState进行绘图状态的管理方法。详细解释了如何通过这两个函数保存和恢复绘图状态,以避免在复杂的图形绘制过程中反复修改上下文状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绘图第一篇 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);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值