在此记录下,两者的区别。
CGContextSaveGState的使用如下:
CGContextRef ctx = UIGraphicsGetCurrentContext();
[UIColor.redColor setFill];
UIRectFill(CGRectMake(0, 0, 50, 50));
CGContextSaveGState(ctx);
[UIColor.blackColor setFill];
UIRectFill(CGRectMake(50, 0, 50, 50));
CGContextRestoreGState(ctx);
UIRectFill(CGRectMake(100, 0, 50, 50));
效果图如下:
Simulator Screen Shot - iPhone 8 - 2020-05-27 at 05.44.27.png
解释说明:
- 首先,先设置上下文的颜色为黑色,接着调用CGContextSaveGState使上下文入栈
- 接着上下文的颜色又改成了黑色,并进行绘制矩形,可以看到此时矩形的颜色变成了黑色
- 当调用CGContextRestoreGState后,使之前保存的上下文出栈,再次画矩形,前面颜色设置的有红色和黑色,此时矩形使用颜色是入栈前设置的红色,恢复到了最初的状态
UIGraphicsPushContext的使用如下:
CGContextRef ctx = UIGraphicsGetCurrentContext();
[UIColor.redColor setFill];
UIRectFill(CGRectMake(0, 0, 50, 50));
UIGraphicsPushContext(ctx);
[UIColor.blackColor setFill];
UIRectFill(CGRectMake(50, 0, 50, 50));
UIGraphicsPopContext();
UIRectFill(CGRectMake(100, 0, 50, 50));
效果图如下:
Simulator Screen Shot - iPhone 8 - 2020-05-27 at 05.57.04.png
解释说明:
- 首先,先设置上下文的颜色为黑色,接着调用UIGraphicsPushContext使上下文入栈
- 接着上下文的颜色又改成了黑色,并进行绘制矩形,可以看到此时矩形的颜色变成了黑色
- 当调用UIGraphicsPopContext后,使之前保存的上下文出栈,再次画矩形,前面颜色设置的有红色和黑色,此时矩形使用颜色是入栈后设置的黑色
结论:
使用CGContextSaveGState保存入栈前的上下文,调用CGContextRestoreGState后,接着使用入栈前的上下文,使之恢复到最初状态。
UIGraphicsPushContext更改当前上下文的状态,简单理解为使用了一个新的上下文,调用UIGraphicsPopContext使旧的上下文进行出栈。
网友评论