Dibuje CAGradient dentro de MKPolyLineView

Tengo un problema con mi MKPolyLineView. Simplemente trato de hacer un gradiente de color para la polilínea, pero con CAGradient funciona. I subclasss MKPolylineView y networkingibujes en

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context UIColor *darker = [UIColor blackColor]; CGFloat baseWidth = self.lineWidth / zoomScale; // draw the dark colour thicker CGContextAddPath(context, self.path); CGContextSetStrokeColorWithColor(context, darker.CGColor); CGContextSetLineWidth(context, baseWidth * 1.5); CGContextSetLineCap(context, self.lineCap); CGContextStrokePath(context); // now draw the stroke color with the regular width CGContextAddPath(context, self.path); CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor); CGContextSetLineWidth(context, baseWidth); CGContextSetLineCap(context, self.lineCap); CGContextStrokePath(context); [super drawMapRect:mapRect zoomScale:zoomScale inContext:context]; } 

pero incluso eso no funciona (StrokeColor = rojo). ¿Alguna idea de cómo get un degradado en la polilínea? (Highcolor, centercolor, lowcolor)

Gracias a todos.

Para pintar una línea MKPolyline con un degradado, puede usar una subclass personalizada de MKPolylineView . Como CoreGraphics no admite acariciar una ruta con un degradado, tenemos que

  1. convierta la ruta a una forma que rastrea el borde de las routes usando CGPathCreateCopyByStrokingPath
  2. recortar el context a esa forma
  3. llenar usando CGContextDrawLinearGradient

Aquí hay una subclass para comenzar:

 @interface TWOGradientPolylineView : MKPolylineView @end @implementation TWOGradientPolylineView - (void)strokePath:(CGPathRef)path inContext:(CGContextRef)context { CGFloat lineWidth = CGContextConvertSizeToUserSpace(context, (CGSize){self.lineWidth, self.lineWidth}).width; CGPathRef pathToFill = CGPathCreateCopyByStrokingPath(path, NULL, lineWidth, self.lineCap, self.lineJoin, self.miterLimit); CGRect rect = CGPathGetBoundingBox(pathToFill); CGContextAddPath(context, pathToFill); CGPathRelease(pathToFill); CGContextClip(context); CGFloat gradientLocations[2] = {0.0f, 1.0f}; CGFloat gradientColors[8] = {1.0f, 0.0f, 0.0f, 0.75f, 1.0f, 1.0f, 0.0f, 0.75f}; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradientColors, gradientLocations, 2); CGColorSpaceRelease(colorSpace); CGPoint gradientStart = rect.origin; CGPoint gradientEnd = {CGRectGetMaxX(rect), CGRectGetMaxY(rect)}; CGContextDrawLinearGradient(context, gradient, gradientStart, gradientEnd, kCGGradientDrawsAfterEndLocation); CGGradientRelease(gradient); } @end 

Aquí hay una captura de pantalla de una ruta dibujada con la class anterior:

captura de pantalla de una ruta con gradiente