iphone core-graphics quartz-graphics drawrect

iphone - Cómo llenar un camino con degradado en drawRect:?



core-graphics quartz-graphics (1)

llenar un camino con un color sólido es bastante fácil:

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 degradado en lugar de un rojo sólido, pero estoy teniendo problemas. Probé el código que figura en la Pregunta / Respuesta: Degradados en UIView y UILabels en iPhone

cual 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 la vista completa de que está dentro del degradado, cubriendo mi ruta original.


Me gustaría recortar a 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); }