gpt4 book ai didi

iphone - 保存和恢复CGContext

转载 作者:行者123 更新时间:2023-12-03 18:29:50 25 4
gpt4 key购买 nike

我试图保存并恢复 CGContext 以避免再次进行繁重的绘图计算,但出现错误 <Error>: CGGStackRestore: gstack underflow

我做错了什么?正确的做法是什么?

- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

if (initialized) {
CGContextRestoreGState(context);
//scale context
return;
}

initialized = YES;

//heavy drawing computation and drawing

CGContextSaveGState(context);
}

最佳答案

我认为您可能误解了 CGContextSaveGState()CGContextRestoreGState() 的作用。它们将当前图形状态插入堆栈并将其弹出,让您可以变换当前绘图空间、更改线条样式等,然后将状态恢复到设置这些值之前的状态。它不存储绘图元素,例如路径。

来自documentation on CGContextSaveGState() :

Each graphics context maintains a stack of graphics states. Note that not all aspects of the current drawing environment are elements of the graphics state. For example, the current path is not considered part of the graphics state and is therefore not saved when you call the CGContextSaveGState() function.

图形状态堆栈应在 drawRect: 开始时重置,这就是当您尝试从堆栈中弹出图形状态时出现错误的原因。由于您没有插入任何一个,因此没有任何一个可以弹出。所有这些意味着您无法将绘图作为图形状态存储在堆栈上,然后在以后恢复。

如果您所担心的只是缓存您的绘图,那么支持您的 UIView(在 iPhone 上)的 CALayer 可以为您完成此操作。如果您所做的只是移动 View ,则不会重新绘制 View 。只有当您手动告诉它这样做时,它才会被绘制。如果您确实必须更新绘图的一部分,我建议将静态元素拆分到它们自己的 View 或 CALayers 中,以便仅重绘更改的部分。

关于iphone - 保存和恢复CGContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1446446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com