如何绘制填充颜色不是实心而是图像的MKCircle

Dix*_*ine 10 iphone objective-c mkmapview mkoverlay

我发现了如何在地图注释周围绘制一个cricle.我是这样做的:

     MKCircle *circle = [MKCircle circleWithCenterCoordinate:theCoordinate radius:15000];
     [myMap addOverlay:circle];

 -(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay
 {
    MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
    circleView.fillColor =[UIColor redColor];

   return circleView;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我想绘制一个圆形,其填充颜色不是这样的实心:

在此输入图像描述

Sam*_*io2 10

使用MKCircleRenderer回答iOS 7 ...

您应该子类化MKCircleRenderer,并覆盖该fillPath:inContext方法,类似于此问题的接受答案.例如

@implementation MKGradientCircleRenderer

- (void)fillPath:(CGPathRef)path inContext:(CGContextRef)context
{

    CGRect rect = CGPathGetBoundingBox(path);

    CGContextAddPath(context, path);
    CGContextClip(context);

    CGFloat gradientLocations[2] = {0.6f, 1.0f};
    // Start color white with 0.25 alpha,
    // End color green with 0.25 alpha
    CGFloat gradientColors[8] = {1.0f, 1.0f, 1.0f, 0.25f, 0.0f, 1.0f, 0.0f, 0.25f};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradientColors, gradientLocations, 2);
    CGColorSpaceRelease(colorSpace);

    CGPoint gradientCenter = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
    CGFloat gradientRadius = MIN(rect.size.width, rect.size.height) / 2;

    CGContextDrawRadialGradient(context, gradient, gradientCenter, 0, gradientCenter, gradientRadius, kCGGradientDrawsAfterEndLocation);

    CGGradientRelease(gradient);


}
Run Code Online (Sandbox Code Playgroud)

然后在你的MKMapView委托中,实现以下方法......

-(MKOverlayRenderer *)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)overlay {

    MKCircle * circle = (MKCircle *)overlay;

    MKGradientCircleRenderer * renderer = [[MKGradientCircleRenderer alloc] initWithCircle:circle];

    return renderer;

}
Run Code Online (Sandbox Code Playgroud)

这将允许您实现相同的效果,但使用iOS 7中提供的新方法.


Tam*_*ese 6

要使用渐变绘制圆,您必须提供自己的注释视图类,因为现有的没有一个支持.你可以做的是你可以覆盖- (void)fillPath:(CGPathRef)path inContext:(CGContextRef)context子类中的方法MKCircleView.以下是一些代码(非优化,带有硬编码填充参数),可帮助您入门:

@interface TWOGradientCircleView : MKCircleView
@end

@implementation TWOGradientCircleView

- (void)fillPath:(CGPathRef)path inContext:(CGContextRef)context
{
    CGRect rect = CGPathGetBoundingBox(path);

    CGContextAddPath(context, path);
    CGContextClip(context);

    CGFloat gradientLocations[2] = {0.6f, 1.0f};
    // Start color white with 0.25 alpha,
    // End color green with 0.25 alpha
    CGFloat gradientColors[8] = {1.0f, 1.0f, 1.0f, 0.25f, 0.0f, 1.0f, 0.0f, 0.25f};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradientColors, gradientLocations, 2);
    CGColorSpaceRelease(colorSpace);

    CGPoint gradientCenter = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
    CGFloat gradientRadius = MIN(rect.size.width, rect.size.height) / 2;

    CGContextDrawRadialGradient(context, gradient, gradientCenter, 0, gradientCenter, gradientRadius, kCGGradientDrawsAfterEndLocation);

    CGGradientRelease(gradient);
}
Run Code Online (Sandbox Code Playgroud)

要使用它,只需替换MKCircleView为TWOGradientCircleView:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay
{
    MKCircleView *circleView = [[TWOGradientCircleView alloc] initWithOverlay:overlay];

    return circleView;
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用图像而不是绘制渐变,可以使用图像绘制替换上面的渐变图.由于放大会使图像模糊,您应该禁用缩放,或者像Apple在WWDC10的会话中演示的那样平铺图像(有关其示例代码,请参阅此处的存储库).UIColor使用图案图像设置a 对半径为15000不起作用(除非您使用非常非常大的图像;)).