CGContextRestoreGState似乎没有恢复以前的状态

时间:2012-12-03 14:26:53

标签: iphone ios ios5 core-graphics dotted-line

所以,我需要沿轴绘制一系列虚线。 在drawRect方法中,我调用另一种方法来绘制轴。 在那个方法中我保存GState绘制轴然后保存gstate在适当的时候再次绘制虚线,然后中断路径恢复gstate添加一些东西到轴填充路径.. 事情是现在整个事情是点缀的...... 当我恢复gstate时,代码似乎没有丢弃虚线图案......

   CGContextSaveGState(ctx);
    CGContextSetFillColorWithColor(ctx, [[UIColor whiteColor] CGColor]);
 .......
    //draw a dased line
            CGContextSaveGState(ctx);
            CGContextSetLineWidth(ctx, 1.0);
            CGContextSetStrokeColorWithColor(ctx, [UIColor whiteColor].CGColor);
            CGFloat const kDashedLinesLength[]   = {1.0f, 0.5f};
            CGContextSetLineDash(ctx, 0.0, kDashedLinesLength, 2);
            CGContextMoveToPoint(ctx, LEFT_EXCLUSION_LENGTH + AXIS_LINE_WIDTH, crtYval);
            CGContextAddLineToPoint(ctx, LEFT_EXCLUSION_LENGTH + AXIS_LINE_WIDTH + self.xAxis.visibleLength , crtYval);
            CGContextStrokePath(ctx);
            CGContextRestoreGState(ctx);
...
   CGContextFillPath(ctx);
    CGContextRestoreGState(ctx);

我怎么能感到疼痛,只有我需要的线被溺爱?

3 个答案:

答案 0 :(得分:1)

我不确定你的代码有什么问题,但它不是上下文恢复中的错误,它可以正常工作。可能你在用.....替换的代码中有另一个错误。

可能是你有不平衡的保存和恢复会导致各种问题 - 我先检查一下。

我将其复制并粘贴到一个小的iOS测试应用程序自定义视图的drawRect方法中,并运行它,我看到了我的期望。

这里是按预期工作的小测试代码:

- (void)drawRect:(CGRect)rect
{
    // Drawing code

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextSaveGState(ctx);
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(ctx, 2.0);

    //draw a dased line
    CGContextSaveGState(ctx);
    CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
    CGFloat const kDashedLinesLength[]   = {1.0f, 2.0f};
    CGContextSetLineDash(ctx, 0.0, kDashedLinesLength, 2);
    CGContextMoveToPoint(ctx, 100, 100 );
    CGContextAddLineToPoint(ctx, 100, 200);
    CGContextStrokePath(ctx);
    CGContextRestoreGState(ctx);


    CGContextMoveToPoint(ctx, 200, 100 );
    CGContextAddLineToPoint(ctx, 200, 200);
    CGContextStrokePath(ctx);

    CGContextFillPath(ctx);
    CGContextRestoreGState(ctx);
}

是样本输出:

screenshot

答案 1 :(得分:0)

您需要小心始终精确平衡“保存”和“还原”。我的情况是,在我的应用程序的完全不同的位置,我有一个或另一个太多。由于iOS部分重用上下文,因此可能会使图形上下文处于奇怪的状态。

您应该在源代码中搜索“保存”和“还原”的所有实例,并计算是否存在相同数量的实例。

答案 2 :(得分:0)

我想我知道你的问题。以这种方式看待它:直到你抚摸路径时才会绘制直线。因此,无论您调用CGContextAddLineToPoint(例如)时生效的模式都无关紧要。当您调用CGContextAddLineToPoint时,您没有绘制线条,而只是构建路径。我猜你用于绘制轴的子程序不会划过它们。在您稍后调用CGContextStrokePath之前,轴不会被绘制,此时虚线图案生效。