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中提供的新方法.
要使用渐变绘制圆,您必须提供自己的注释视图类,因为现有的没有一个支持.你可以做的是你可以覆盖- (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不起作用(除非您使用非常非常大的图像;)).
| 归档时间: |
|
| 查看次数: |
5873 次 |
| 最近记录: |