The following code draws a half circle with a gradient from red to green. This is not what I wanted. I expected an arc of width 5 pixels that is painted w开发者_开发百科ith the gradient.
Any help in showing where I've gone wrong will be greatly appreciated.
Charles
-(void) DrawRainbow {
// Create an arc path
float x = 150.0;
float y = 220.0;
float radius = 75.0;
float startAngle = M_PI;
float endAngle = 2*M_PI;
bool clockWise = false;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path, nil, x, y, radius, startAngle, endAngle, clockWise);
// Setup the gradient
size_t num_locations = 2;
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = {
1.0, 0.0, 0.0, 1.0, // Start color is red
0.0, 1.0, 0.0, 1.0 }; // End color is green
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradientFill =
CGGradientCreateWithColorComponents (colorSpace, components,
locations, num_locations);
// setup gradient points
CGRect pathRect = CGPathGetBoundingBox(path);
CGPoint myStartPoint, myEndPoint;
myStartPoint.x = CGRectGetMinX(pathRect);
myStartPoint.y = CGRectGetMinY(pathRect);
myEndPoint.x = CGRectGetMaxX(pathRect);
myEndPoint.y = CGRectGetMinY(pathRect);
// draw the gradient
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 5.0);
CGContextAddPath(context, path);
CGContextSaveGState(context);
CGContextClip(context);
CGContextDrawLinearGradient (context, gradientFill,
myStartPoint, myEndPoint, 0);
CGContextRestoreGState(context);
CGGradientRelease(gradientFill);
CGColorSpaceRelease(colorSpace);
}
I think you want a radial gradient. See this Apple document.
https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_shadings/dq_shadings.html
The resulting gradient, to me, looks like the backdrop for a fuel guage, so a radial gradient may not give the proper effect. I don't have a lot of experience with quartz, but my idea is to fill in an ellipse using the background color.
radius -= 5.0;
CGRect rainbowArch = CGRectMake( x - radius, y - radius, 2 * radius, 2 * radius);
const CGFloat * bgComponents = CGColorGetComponents( self.backgroundColor.CGColor );
CGContextSetRGBFillColor(context, bgComponents[0], bgComponents[1], bgComponents[2], 1.0);
CGContextFillEllipseInRect( context, rainbowArch );
...
CGContextRestoreGState(context);
CGGradientRelease(gradientFill);
CGColorSpaceRelease(colorSpace);
精彩评论