CGContextSaveGState与UIGraphicsPushContext

时间:2013-03-19 17:01:02

标签: ios objective-c drawrect cgcontext

有两种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

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

2 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:0)

当您想要使用UIkit绘制并且当前上下文不是您要绘制的上下文时,UIGraphicsPushContext(ctx)非常有用。您可以使用此函数使您想要绘制的上下文成为当前上下文。 CGContextSaveGState(ctx)保存上下文(由ctx引用),以后可以恢复上下文使用CGContextRestoreGState()