1 结论
- CGContextSaveGState是保存当前的上下文,可以理解为保存了当前的绘制环境,比如画笔颜色、画笔大小等信息。
2 实验:
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
//设置蓝色画笔
CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
//画圆
CGContextAddArc(ctx, 200, 200, 100, 0, 2*M_PI, 0);
CGContextDrawPath(ctx, kCGPathFill);
//保存环境
CGContextSaveGState(ctx);
CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
//画矩形
CGContextAddRect(ctx, CGRectMake(200, 200, 200, 200));
CGContextDrawPath(ctx, kCGPathFill);
//还原环境
CGContextRestoreGState(ctx);
//画圆
CGContextAddArc(ctx, 200, 500, 100, 0, 2*M_PI, 0);
CGContextDrawPath(ctx, kCGPathFill);
}
效果:
分析:上述代码中
- 先是设置了蓝色画笔,画了一个圆,接着保存上下文(CGContextSaveGState)
- 然后再设置红色画笔,画一个红色矩形
- 最后再还原上下文,这时画笔被还原回了蓝色状态,所以画出来的圆形是蓝色的。
3 实际生产中的作用
想象一个场景,在当前绘画环境下,我们设置了许多绘画状态,比如填充颜色、描边颜色、文字大小、字体等。这时,我们需要绘制一个特殊的文字(许多绘画状态都需要改变),但是又不希望之前的状态都被清空了,于是我们使用了CGContextSaveGState这个方法来把这些上下文环境(绘画状态)保存了起来,设置一个白色字体,绘制完我们的特殊文字之后,调用CGContextRestoreGState把上下文环境还原回来。