25

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

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

4

2 回答 2

39

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

于 2013-03-19T17:06:59.693 回答
1

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

于 2016-05-26T09:06:02.537 回答