5

MKOverlayPathViewから継承するマップカスタムビューがあります。円、線、テキストを表示するには、このカスタムビューが必要です。

パス描画CGPathAddArc関数とCGPathAddLineToPoint関数を使用して、すでに円と線を描画することができました。

ただし、テキストを追加する必要があります。

を使用してテキストを追加しようとしました

 [text drawAtPoint:centerPoint withFont:font];

しかし、無効なコンテキストエラーが発生しました。

何か案が?

4

2 に答える 2

8

ではMKOverlayPathView、テキストを追加する最も簡単な方法は、パスとテキストの描画を上書きdrawMapRect:zoomScale:inContext:してそこに置くことだと思います (そして、何もしないか、実装しないでくださいcreatePath)。

ただし、drawMapRectとにかく使用する場合はMKOverlayViewMKOverlayPathView.

を使用しMKOverlayViewてメソッドをオーバーライドし、(またはまたは)drawMapRect:zoomScale:inContext:を使用して円を描画します。 CGContextAddArcCGContextAddEllipseInRectCGPathAddArc

drawAtPoint必要な を持つこのメソッドを使用してテキストを描画できますcontext

例えば:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    //calculate CG values from circle coordinate and radius...
    CLLocationCoordinate2D center = circle_overlay_center_coordinate_here;

    CGPoint centerPoint = 
        [self pointForMapPoint:MKMapPointForCoordinate(center)];

    CGFloat radius = MKMapPointsPerMeterAtLatitude(center.latitude) * 
                         circle_overlay_radius_here;

    CGFloat roadWidth = MKRoadWidthAtZoomScale(zoomScale);

    //draw the circle...
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] colorWithAlphaComponent:0.2].CGColor);
    CGContextSetLineWidth(context, roadWidth);
    CGContextAddArc(context, centerPoint.x, centerPoint.y, radius, 0, 2 * M_PI, true);
    CGContextDrawPath(context, kCGPathFillStroke);

    //draw the text...
    NSString *text = @"Hello";
    UIGraphicsPushContext(context);
    [[UIColor redColor] set];
    [text drawAtPoint:centerPoint 
             withFont:[UIFont systemFontOfSize:(5.0 * roadWidth)]];
    UIGraphicsPopContext();
}

別の回答のコメントに関連して...

関連する変更の中心座標または半径 (または何でも) が変更された場合、(オーバーレイを削除して再度追加する代わりに) それを呼び出して「移動」するMKOverlayことができます。( を使用する場合は、代わりに呼び出すことができます。)MKOverlayViewsetNeedsDisplayInMapRect:MKOverlayPathViewinvalidatePath

を呼び出すときに、map rect パラメータのオーバーレイの を setNeedsDisplayInMapRect:渡すことができます。boundingMapRect

WWDC 2010 の LocationReminders サンプル アプリでは、オーバーレイ ビューは KVO を使用して関連付けられた へのMKOverlay変更を監視し、円のプロパティへの変更を検出するたびに移動しますが、他の方法で変更を監視しsetNeedsDisplayInMapRect:、オーバーレイ ビューの外部から明示的に呼び出すことができます。 .

(別の回答へのコメントで、使用について言及しましMKOverlayPathViewたが、それが LocationReminders アプリが移動する円のオーバーレイ ビューを実装する方法です。しかし、使用MKOverlayViewして円を描く方法についても言及する必要がありました。申し訳ありません。)

于 2012-05-10T21:06:04.543 に答える
1

コンテキストをプッシュするとUIGraphicsPushContext、問題が発生しました。メソッドdrawMapRect:zoomScale:inContext:が異なるスレッドから同時に呼び出されることを思い出してください。そのため、呼び出すUIGraphicsPushContextために呼び出されたところから始まるコードの一部を同期する必要がありましたUIGraphicsPopContext

また、フォント サイズを計算する際には、iPad、iPad2、iPhone3 の場合は、iPhone4 ~ 5 および iPad3 の場合は を考慮する必要があり[UIFont systemFontOfSize:(5.0 * roadWidth)]ます。そうしないと、文字サイズが iPad2 と iPad3 で異なります。[UIScreen mainScreen].scale12

だから私にとっては、次のように終わりました:[UIFont boldSystemFontOfSize:(6.0f * [UIScreen mainScreen].scale * roadWidth)]

于 2012-11-19T07:44:30.530 に答える