¿Cómo dibujar un arco de gradiente con Core Graphics / iPhone?

dibujar un arco

y también encontré cómo dibujar una línea de gradiente desde aquí

He encontrado que dos funciones pueden dibujar gradiente: CGContextDrawLinearGradient y CGContextDrawRadialGradient.but ¿cómo puedo dibujar un arco de degradado? Quiero darme count como esta foto: introduzca la descripción de la imagen aquí

Pasé mucho time buscando cómo hacer esto también, así que pensé que publicaría la forma en que terminé haciéndolo. Resulta que ambas respuestas están en la excelente respuesta a esta pregunta:

Dibuja segmentos de un círculo o dona

Para mis propósitos, solo utilicé las partes de dibujo y gradiente de esa respuesta. La estructura se parece más o less a esto …

CGContextRef context = UIGraphicsGetCurrentcontext(); CGFloat arcStartAngle = M_PI; CGFloat arcEndAngle = 2 * M_PI; CGPoint startPoint = CGPointMake(...); CGPoint endPoint = CGPointMake(...); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGFloat colors[] = { 1.0, 0.0, 0.0, 1.0, //RGBA values (so networking to green in this case) 0.0, 1.0, 0.0, 1.0 }; CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, NULL, 2); //Where the 2 is for the number of color components. You can have more colors throughout //your gradient by adding to the colors[] array, and changing the components value. CGColorSpaceRelease(colorSpace); //Now for the arc part... CGMutablePathRef arc = CGPathCreateMutable(); CGPathMoveToPoint(arc, NULL, startPoint.x, startPoint.y); //Here, the CGPoint self.arcCenter is the point around which the arc is placed, so maybe the //middle of your view. self.radius is the distance between this center point and the arc. CGPathAddArc(arc, NULL, self.arcCenter.x, self.arcCenter.y, self.radius, arcStartAngle, arcEndAngle, YES); //This essentially draws along the path in an arc shape CGPathRef strokedArc = CGPathCreateCopyByStrokingPath(arc, NULL, 5.0f, kCGLineCapButt, kCGLineJoinMiter, 10); CGContextSaveGState(context); CGContextAddPath(context, strokedArc); CGContextClip(context); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); CGContextDrawPath(context, kCGPathFillStroke); CGGradientRelease(gradient); CGContextRestoreGState(context); //This all draws a gradient that is much larger than the arc itself, but using //CGContextClip, it clips out everything EXCEPT the colors in the arc. Saving and Restoring //the state allows you to preserve any other drawing going on. If you didn't use these, //then all other drawing would also be clipped. 

Espero que esto ayude. Si algo de esto no está claro, le recomiendo que revise el enlace de pregunta anterior. La respuesta a esas preguntas contiene todo lo que utilicé en esta respuesta y algunos consejos de dibujo más interesantes y útiles.

Podría hacerlo utilizando CGContextDrawRadialGradient() con una ruta de recorte aplicada. Puedes hacer algo como esto:

 CGContextBeginPath(context); CGContextMoveToPoint(context, startX, startY); CGContextAddArcToPoint(context, x1, y1, x2, y2, arcRadius); CGConextClosePath(context); CGContextClip(context); CGContextDrawRadialGradient(context, gradient, startCenter, startRadius, endCenter, endRadius, options);