【问题标题】:CGContextRestoreGState seems not to restore the previous stateCGContextRestoreGState 似乎没有恢复以前的状态
【发布时间】:2012-12-03 14:26:52
【问题描述】:

所以,我需要沿轴绘制一系列虚线。 在 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);

我怎么能让只有我需要的线被宠坏?

【问题讨论】:

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


    【解决方案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);
    }
    

    并且是示例输出:

    【讨论】:

      【解决方案2】:

      您需要注意始终准确平衡保存和恢复。我曾经在我的应用程序的一个完全不同的位置有一个或另一个太多的情况。由于 iOS 部分重用了上下文,这可能会使图形上下文处于奇怪的状态。

      您应该在源代码中搜索 Save 和 Restore 的所有实例,并计算它们的数量是否相等。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-27
          • 2015-11-17
          相关资源
          最近更新 更多