0

我在-drawRect视图中有这个方法:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    GraphPoint* point = [points objectAtIndex:i];
    [point.color setFill];
    [[UIColor blackColor] setStroke];
    CGContextBeginPath(context);
    CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
    CGContextFillPath(context);
    CGContextStrokePath(context);
    UIGraphicsPopContext();
}

[points count]等于 1 时,一切正常,但是,当它增加时,会抛出此错误:

Error>: CGContextSetStrokeColorWithColor: invalid context 0x0.

我认为循环有问题 - 它设置了上下文的颜色两次甚至更多次。不知道如何避免。每个点都必须有自己的颜色,我不能在循环之前设置上下文的填充颜色。

请帮忙!也许有人曾经遇到过这个问题?

4

2 回答 2

3

您误解了 UIGraphicsPopContext 的作用。我假设您正在尝试清除在上下文中设置的当前路径。你想要CGContextSaveGStateCGContextRestoreGState

尝试这个:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    CGContextSaveGState(context);
    {
        GraphPoint* point = [points objectAtIndex:i];
        [point.color setFill];
        [[UIColor blackColor] setStroke];
        CGContextBeginPath(context);
        CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
        CGContextFillPath(context);
        CGContextStrokePath(context);
    }
    CGContextRestoreGState(context);
}

注意我通常在使用基于堆栈的操作(推送和弹出)时创建一个新范围(带有额外的{and }),以便轻松检查它们是否平衡。当然,这是可选的。

于 2012-08-13T19:18:48.380 回答
1

您在每个循环上弹出上下文,但您不推送它。所以你的上下文堆栈上的上下文用完了。

删除 UIGraphicsPopContext 调用,看看它是否修复它。

于 2012-08-13T19:11:37.637 回答