所以,我需要沿轴绘制一系列虚线。 在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);
我怎么能感到疼痛,只有我需要的线被溺爱?
答案 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);
}
是样本输出:
答案 1 :(得分:0)
您需要小心始终精确平衡“保存”和“还原”。我的情况是,在我的应用程序的完全不同的位置,我有一个或另一个太多。由于iOS部分重用上下文,因此可能会使图形上下文处于奇怪的状态。
您应该在源代码中搜索“保存”和“还原”的所有实例,并计算是否存在相同数量的实例。
答案 2 :(得分:0)
我想我知道你的问题。以这种方式看待它:直到你抚摸路径时才会绘制直线。因此,无论您调用CGContextAddLineToPoint(例如)时生效的模式都无关紧要。当您调用CGContextAddLineToPoint时,您没有绘制线条,而只是构建路径。我猜你用于绘制轴的子程序不会划过它们。在您稍后调用CGContextStrokePath之前,轴不会被绘制,此时虚线图案生效。