2012-05-10 1 views
4

MKOverlayPathViewから継承するマップカスタムビューがあります。円、線、テキストを表示するにはこのカスタムビューが必要です。Paths Drawingを使用してテキストを追加する方法はありますか

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

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

私は

[text drawAtPoint:centerPoint withFont:font]; 

を使用してテキストを追加しようとしましたが、私は、無効なコンテキストエラーを得ました。

答えて

7

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

とにかくdrawMapRectを使用する場合は、MKOverlayPathViewの代わりにMKOverlayViewというプレーンのサブクラス化に切り替えることをおすすめします。 MKOverlayView

drawMapRect:zoomScale:inContext:メソッドをオーバーライドしCGContextAddArc(又はCGContextAddEllipseInRect又はCGPathAddArc)を使用して円を描きます。

このメソッドでは、drawAtPointを使用してテキストを描画することができます。この場合、必要なのはcontextです。例えば

:関連するMKOverlay変化の別の答えにコメントに関連して

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

...

中心座標や半径(または何でも)、あなたはMKOverlayViewを作ることができますオーバーレイをもう一度削除して追加する代わりに、setNeedsDisplayInMapRect:を呼び出して「移動」します。 MKOverlayPathViewを使用する場合は、代わりにinvalidatePathを呼び出すことができます。

setNeedsDisplayInMapRect:を呼び出すときは、マップのrectパラメータのオーバーレイのboundingMapRectを渡すことができます。 WWDC 2010からLocationRemindersサンプルアプリで

、オーバーレイビューは、関連するMKOverlayに変化を観察するためにKVOを使用し、それが円のプロパティの変更を検出するたび自体が移動しますが、あなたは他の方法の変化を監視し、setNeedsDisplayInMapRect:を呼び出すことができますオーバーレイビューの外側から明示的に

(別の答えにコメントで私はMKOverlayPathViewを使用して言及を行なったし、それがLocationRemindersアプリが移動サークルオーバーレイビューを実装する方法である。しかし、私はあなたにも、円を描くようにMKOverlayViewを使用することができますどのように言及している必要があります。については申し訳ありませんそれ)

+0

おかげアンナが...私は、円を描くようにMKOverlayPathViewを使用しましたし、それが正常に動作します:

だから、私にとって、それはこのように終わりました。私はビューの移動をアニメートする必要がある。現時点では、地図上のデフォルトのユーザーマーカーは、場所が変更されたときにアニメーション表示されます。したがって、私の円のビューもアニメ化されるべきです。私は[UIView beginAnimationsと[UIView commitAnimations]を使用する必要があることを知っています。私はこのコードをどこに置くべきかわかりません。 MKOverlayPathViewでinvalidatePathの前後に配置する必要がありますか? – user836026

+1

通常、ビューをアニメーション化するには、beginAnimations/commitAnimations(またはブロックベースのanimateWithDuration)を使用しますが、これはMKOverlayViewsでは機能しません(少なくとも私は方法はわかりません)。ただし、MKOverlayの代わりにMKnnotation(円のイメージまたは円の描画)を使用しても構わない場合は、注釈ビューをスムーズにアニメートできます。たとえば、http://stackoverflow.com/questions/8564013/animate-removal-of-annotationsを参照してください。注釈の問題は、画像/図面が一定のサイズ(ユーザーの場所の青い点のような)のままであることだけです。 – Anna

1

UIGraphicsPushContextでコンテキストをプッシュすると問題が発生しました。メソッドdrawMapRect:zoomScale:inContext:が同時に異なるスレッドから呼び出されていることを思い出して、UIGraphicsPushContextが呼び出されてからUIGraphicsPopContextという呼び出しを開始する部分のコードを同期させなければならなかったことを思い出してください。

また[UIFont systemFontOfSize:(5.0 * roadWidth)] 1のようにフォントサイズを計算するときには考慮[UIScreen mainScreen].scaleを取る必要があり、アプリ、iPad2のために、これをiPhone3は1とiPhone4のためのものである - 5とiPad3は2あります。それ以外の場合は、テキストサイズはiPad2からiPad3までとは異なります。 [UIFont boldSystemFontOfSize:(6.0f * [UIScreen mainScreen].scale * roadWidth)]

関連する問題