使用CGContextStrokePath更改颜色

sti*_*att 5 cocoa-touch

我正试图用iPhone/Touch SDK绘制一些简单的线条.我希望能够更改行的颜色,但调用CGContextSetRGBStrokeColor似乎不会影响使用CGContextAddLineToPoint创建的绘制线,直到实际调用CGContextStrokePath.因此,如果我进行多次调用以更改颜色,则只有在CGContextStrokePath之前生成的颜色才会生效.这就是我的意思:

    - (void)drawRect:(CGRect)rect 
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextSetRGBStrokeColor(ctx,1,0,0,1);
    CGContextAddLineToPoint(ctx, 100, 100);
    //CGContextStrokePath(ctx);
    CGContextSetRGBStrokeColor(ctx,0,1,0,1);
    CGContextAddLineToPoint(ctx, 200, 300);
    //CGContextStrokePath(ctx);
    CGContextSetRGBStrokeColor(ctx,0,0,1,1);
    CGContextStrokePath(ctx);
}
Run Code Online (Sandbox Code Playgroud)

我假设我正在做一些可怕的错误,我只是无法弄清楚是什么.我想如果我添加了CGContextStrokePath调用,那会有所帮助,但事实并非如此.

请参阅下面的讨论,了解我如何获得更正的代码:

- (void)drawRect:(CGRect)rect 
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, 0, 0);
    CGContextSetRGBStrokeColor(ctx,1,0,0,1);
    CGContextAddLineToPoint(ctx, 100, 100);
    CGContextStrokePath(ctx);
    CGContextClosePath(ctx);
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, 100, 100);
    CGContextSetRGBStrokeColor(ctx,0,1,0,1);
    CGContextAddLineToPoint(ctx, 200, 300);
    CGContextStrokePath(ctx);
}
Run Code Online (Sandbox Code Playgroud)

Pie*_*key 4

我不认为你做了什么可怕的错误,只是给定图形上下文的 CGContextStrokePath 一次只能有一个 RGBStrokeColor 。因此,需要多次调用 CGContextStrokePath,每种颜色一次。

每次调用 CGContextAddLineToPoint() 时,都会将对 Graphics Context 的引用(不是副本)添加到该绘图操作堆栈中。当您最终调用 CGContextStrokePath() 时,将使用 RGBStrokeColor 的最后一个值。

如果您想在相同的图形上下文中使用多种颜色,那么您似乎需要多次调用 CGContextStrokePath() ,并在调用之间更改图形上下文上的 RGBStrokeColor() 的值。AccelerometerGraph/GraphView.m 中的 Apple 示例代码似乎也表明了这一点。