CGContextSaveGState vs UIGraphicsPushContext

有两个drawRect方法:

- (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); // do drawing here CGContextRestoreGState(context); } 

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); UIGraphicsPushContext(context); // do drawing here UIGraphicsPopContext(); } 

UIGraphicsPushContext / UIGraphicsPopContext来自UIKit,而CGContextSaveGState / CGContextRestoreGState来自CoreGraphics

问题 :这些方法有什么区别? 哪一个更好用? 是否有一些比其他方法更好的certificate方法,反之亦然?

UIGraphicsPushContext(context)将上下文推送到CGContextRefs的堆栈(使上下文成为当前的graphics上下文),而CGContextSaveGState(context)将当前的graphics状态推送到上下文维护的graphics状态堆栈上。 如果您需要创build新的CGContextRef当前绘图上下文,则应该使用UIGraphicsPushContext,并且在使用一个graphics上下文时只应使用CGContextSaveGState,并且只想保存,例如:当前变换状态,填充或笔触颜色,等等

UIGraphicsPushContext(ctx)在你想用UIkit绘制时是很有用的,而且当前的上下文不是你想要绘制的上下文。你使用这个函数使你想绘制的上下文成为当前的上下文。 CGContextSaveGState(ctx)保存上下文(由ctx引用),稍后可以使用CGContextRestoreGState()恢复上下文