グラデーションで円を描くには、独自の注釈ビュー クラスを提供する必要があります。これは、既存の注釈ビュー クラスがサポートしていないためです。できることは- (void)fillPath:(CGPathRef)path inContext:(CGContextRef)context
、のサブクラスでメソッドをオーバーライドできることですMKCircleView
。開始するためのコード (最適化されていない、ハードコードされた fill パラメーターを使用) を次に示します。
@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);
}
MKCircleView
それを使用するには、次のように置き換えTWOGradientCircleView
ます。
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay
{
MKCircleView *circleView = [[TWOGradientCircleView alloc] initWithOverlay:overlay];
return circleView;
}
グラデーションを描画する代わりに画像を使用したい場合は、上のグラデーション描画を画像描画に置き換えることができます。ズームインすると画像がぼやけるため、ズームを無効にするか、Apple が WWDC10 のセッションで示したように画像を並べて表示する必要があります (サンプル コードを含むリポジトリについては、こちらを参照してください)。パターン イメージで を設定しUIColor
ても、半径が 15000 の場合は機能しません (非常に巨大なイメージを使用しない限り ;))。