有两种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 。
问题:这些方法有什么区别?哪一个更好用?是否有一些证明一种方法比其他方法更好的例子,反之亦然?
答案 0 :(得分:34)
UIGraphicsPushContext(context)
将上下文推送到CGContextRefs堆栈(使上下文成为当前绘图上下文),而CGContextSaveGState(context)
将当前图形状态推送到由维护的图形状态堆栈上下文。如果你需要在当前的绘图上下文中创建一个新的CGContextRef,你应该使用UIGraphicsPushContext,当你使用一个图形上下文并且只想保存时,你应该使用CGContextSaveGState,例如:当前的变换状态,填充或描边颜色,等
答案 1 :(得分:0)
当您想要使用UIkit绘制并且当前上下文不是您要绘制的上下文时,UIGraphicsPushContext(ctx)非常有用。您可以使用此函数使您想要绘制的上下文成为当前上下文。 CGContextSaveGState(ctx)保存上下文(由ctx引用),以后可以恢复上下文使用CGContextRestoreGState()