Lee Armstrong
Lee Armstrong

Reputation: 11452

CoreGraphics Multi-Colored Line

I have the following code the only seems to use the last colour for the whole line..... I want the colour to be changing throughout this. Any ideas?

        CGContextSetLineWidth(ctx, 1.0);

        for(int idx = 0; idx < routeGrabInstance.points.count; idx++)
        {
            CLLocation* location = [routeGrabInstance.points objectAtIndex:idx];

            CGPoint point = [mapView convertCoordinate:location.coordinate toPointToView:self.mapView];

            if(idx == 0)
            {
                // move to the first point
                UIColor *tempColor = [self colorForHex:[[routeGrabInstance.pointHeights objectAtIndex:idx] doubleValue]];
                CGContextSetStrokeColorWithColor(ctx,tempColor.CGColor);
                CGContextMoveToPoint(ctx, point.x, point.y);

            }
            else
            {
                    UIColor *tempColor = [self colorForHex:[[routeGrabInstance.pointHeights objectAtIndex:idx] doubleValue]];
                    CGContextSetStrokeColorWithColor(ctx,tempColor.CGColor);
                    CGContextAddLineToPoint(ctx, point.x, point.y);
            }
        }

        CGContextStrokePath(ctx);

Upvotes: 5

Views: 1967

Answers (2)

Michal
Michal

Reputation: 4875

CGContextSetStrokeColorWithColor sets the stroke color in the context. That color is used when you stroke the path, it has no effect as you continue building the path.

You need to stroke each line separately (CGContextStrokePath).

Upvotes: -1

loomer
loomer

Reputation: 2017

The CGContextSetStrokeColorWithColor only changes the state of the context, it does not do any drawing. The only drawing done in your code is by the CGContextStrokePath at the end. Since each call to CGContextSetStrokeColorWithColor overrides the value set by the previous call the drawing will use the last color set.

You need to create a new path, set the color and then draw in each loop. Something like this:

for(int idx = 0; idx < routeGrabInstance.points.count; idx++)
{
    CGContextBeginPath(ctx);
    CGContextMoveToPoint(ctx, x1, y1);
    CGContextAddLineToPoint(ctx, x2, y2);
    CGContextSetStrokeColorWithColor(ctx,tempColor.CGColor);
    CGContextStrokePath(ctx);
}

Upvotes: 6

Related Questions