2010-06-06 9 views
36

llenar un camino con un color sólido es bastante fácil:Cómo llenar una ruta con degradado en drawRect :?

CGPoint aPoint; 
for (id pointValue in points) 
{ 
    aPoint = [pointValue CGPointValue]; 
    CGContextAddLineToPoint(context, aPoint.x, aPoint.y); 
} 
[[UIColor redColor] setFill]; 
[[UIColor blackColor] setStroke]; 
CGContextDrawPath(context, kCGPathFillStroke); 

me gustaría dibujar un gradiente en lugar de rojo sólido, pero estoy teniendo problemas. he probado el código que aparece en la pregunta/respuesta: Gradients on UIView and UILabels On iPhone

cuales es:

CAGradientLayer *gradient = [CAGradientLayer layer]; 
[gradient setFrame:rect]; 
[gradient setColors:[NSArray arrayWithObjects:(id)[[UIColor blueColor] CGColor], 
       (id)[[UIColor whiteColor] CGColor], nil]]; 
[[self layer] setMasksToBounds:YES]; 

[[self layer] insertSublayer:gradient atIndex:0]; 

Sin embargo, esto pinta toda la opinión de que esto es con el gradiente, cubriendo mi ruta original.

Respuesta

89

Me gustaría recortar en la ruta que desea llenar y utilizar CGContextDrawLinearGradient. Aquí hay una implementación simple de drawRect: como un ejemplo:

- (void) drawRect:(CGRect)rect 
{ 
    // Create a gradient from white to red 
    CGFloat colors [] = { 
     1.0, 1.0, 1.0, 1.0, 
     1.0, 0.0, 0.0, 1.0 
    }; 

    CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); 
    CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2); 
    CGColorSpaceRelease(baseSpace), baseSpace = NULL; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(context); 
    CGContextAddEllipseInRect(context, rect); 
    CGContextClip(context); 

    CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); 
    CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); 

    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
    CGGradientRelease(gradient), gradient = NULL; 

    CGContextRestoreGState(context); 

    CGContextAddEllipseInRect(context, rect); 
    CGContextDrawPath(context, kCGPathStroke); 
} 
+1

¡Si pudiera darle una placa impresionante lo haría! ¿Conoces algún tutorial sobre CGContextSaveGState y esas cosas? Porque la referencia de clase de apple es algo delgada. – Derrick

+0

Derrick: La Guía de programación en 2D de Quartz lo cubre, junto con todo lo demás: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html#//apple_ref/doc/ uid/TP30001066-CH202-TPXREF132 –

+1

Después de usar su código de ejemplo, mi sombra ha desaparecido. He intentado reubicar la línea de sombra ("CGContextSetShadow (context, CGSizeMake (5.0, -5.0), 4);") antes de guardar gstate, después de ella, antes de restaurar el gstate, después de él, antes y después del recorte - nada ayudado. – Doron

Cuestiones relacionadas