2010-05-12 27 views
5

El siguiente código dibuja un semicírculo con un degradado de rojo a verde. Esto no es lo que quería. Esperaba un arco de 5 píxeles de ancho que se pinta con el degradado.¿Cómo puedo dibujar un arco lleno de degradado, es decir, arcoíris?

Me agradecerán cualquier ayuda para mostrar dónde me he equivocado.

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

}

Respuesta

-3

El gradiente resultante, para mí, parece que el telón de fondo para un calibre de combustible, por lo que un gradiente radial no puede dar el efecto adecuado. No tengo mucha experiencia con cuarzo, pero mi idea es rellenar una elipse con el color de fondo.

enter image description here

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); 
Cuestiones relacionadas