在MKPolyLine视图中绘制渐变

时间:2013-03-13 10:35:37

标签: ios objective-c calayer cagradientlayer

我的MKPolyLineView只有一个问题。我只是尝试为Polyline创建一个颜色渐变,但是使用CAGradient它会起作用。我将MKPolylineView子类化并重新绘制

- (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];
}

但即使这样也行不通(StrokeColor =红色)。任何想法如何获得渐变 折线? (高色,中心色,低色)

谢谢大家。

1 个答案:

答案 0 :(得分:6)

要使用渐变绘制MKPolyline,您可以使用MKPolylineView的自定义子类。由于CoreGraphics不支持使用渐变来描边,我们必须

  1. 使用CGPathCreateCopyByStrokingPath
  2. 将路径转换为跟踪路径边缘的形状
  3. 将上下文剪辑为该形状
  4. 使用CGContextDrawLinearGradient
  5. 填充

    这是一个让你入门的子类:

    @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
    

    以下是使用上述类绘制的路径的屏幕截图:

    screenshot of a path with a gradient