1

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

我怎么能痛到只有我需要的线被宠坏了???

4

3 回答 3

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);
}

并且是示例输出:

截屏

于 2012-12-08T23:10:18.673 回答
0

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

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

于 2012-12-10T09:29:04.827 回答
0

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

于 2012-12-11T15:49:05.617 回答