2011-10-19 7 views
10

MKMapViewにテキストを含むサークルオーバーレイを描画しようとしています。 MKCircleViewをサブクラス化しましたが、次のようにします(thisに基づいています)が、テキストは表示されません。円は正しく表示されます。 (また、最初の応答のソリューション、同じ結果を試してみました)。デバッグ時にサークルオーバーレイでテキストを描画

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { 
    [super drawMapRect:mapRect zoomScale:zoomScale inContext:context]; 
    NSString * t= @"XXXXX\nXXXX" ; 
    UIGraphicsPushContext(context); 
    CGContextSaveGState(context); 
    [[UIColor redColor] set]; 
    CGRect overallCGRect = [self rectForMapRect:[self.overlay boundingMapRect]]; 
    NSLog(@"MKC : %lf, %lf ----> %lf , %lf ", mapRect.origin.x ,mapRect.origin.y , overallCGRect.origin.x, overallCGRect.origin.y); 
    [t drawInRect:overallCGRect withFont:[UIFont fontWithName:@"Arial" size:10.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter]; 
    CGContextRestoreGState(context); 
    UIGraphicsPopContext(); 
} 

、私はこれらの

MKC : 43253760.000000, 104071168.000000 ----> 1.776503 , 1.999245 
MKC : 43253760.000000, 104071168.000000 ----> -1.562442 , -2.043090 

のような値を取得し、彼らは通常はありますか?私は何が欠けていますか?

ありがとうございました。

+0

は、以下のテキストを描画する方法についての私の質問を解決しました。しかし、私のテキストは水平に中央揃えされていますが、垂直方向はMKCircleViewの上部に描かれています。あなたは縦と横を中心にしていますか? – Diziet

+0

私は間違ったテキストの場所を計算していました。ホーハム。 :P – Diziet

+2

誰かがそれを必要とするなら、これは、テキストの幅と高さを考慮して、テキストをサークルの中央に配置する方法です: 'CGSize size = [str sizeWithFont:[UIFont fontWithName:@" Arial "size:9]]; CGPoint center = CGPointMake(circleRect.origin.x + circleRect.size.width /2,ircreRect.origin.y + circleRect.size.height/2); CGPoint textstart = CGPointMake(center.x - size.width/2、center.y - size.height/2); ' – Templar

答えて

12

私はあなたのコードが動作していると思うし、問題は、テキストが正しく表示されないように拡大縮小されていないということです。

スケールMKRoadWidthAtZoomScale機能を使用してzoomScaleに基づいて、フォントサイズ:

[t drawInRect:overallCGRect withFont:[UIFont fontWithName:@"Arial" 
    size:(10.0 * MKRoadWidthAtZoomScale(zoomScale))] 
    lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter]; 

はまた、基本的な円の色と異なるのテキストの色を使用してください。

drawInRectを使用すると、テキストが円の内側に制限され、切り捨てられることがあります。すべてのテキストを常に表示したい場合は、代わりにdrawAtPointを使用できます。ここでの回答を組み合わせるとIOS7用に更新

+0

ありがとうございます!それは今働いている:)私はzoomlevelを考慮に入れることを忘れていた。円の中心と、テキストサイズに基づいて始まるポイントを計算し、drawAtPointを使って完全に中央に表示します。 – Templar

2

ほとんどの場合、テキストは見えない矩形に描画されている可能性があります。

まず、%lfの代わりに%fとして値を印刷してみてください。値が狂っているように見えます。また、2つの矩形(mapRectoverallCGRect)については、.size.width.size.heightを印刷する必要があります。

これで意味のある四角形の定義にならない場合は、CGRectMake(0,0,100,20)のように自分でCGRectを定義し、テキストが描画されるかどうかを確認してください。

テキストを描画するのと同じoverallCGRectに塗りつぶし矩形を描画してみることもできます。

3

:答えでこれを組み合わせる

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{ 
    [super drawMapRect:mapRect zoomScale:zoomScale inContext:context]; 

    UIGraphicsPushContext(context); 
    CGContextSaveGState(context); 
    [[UIColor blueColor] set]; 

    NSDictionary *fontAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:10.0f * MKRoadWidthAtZoomScale(zoomScale)]}; 
    CGSize size = [[[self overlay] title] sizeWithAttributes:fontAttributes]; 
    CGFloat height = ceilf(size.height); 
    CGFloat width = ceilf(size.width); 

    CGRect circleRect = [self rectForMapRect:[self.overlay boundingMapRect]]; 
    CGPoint center = CGPointMake(circleRect.origin.x + circleRect.size.width /2, circleRect.origin.y + circleRect.size.height /2); 
    CGPoint textstart = CGPointMake(center.x - width/2, center.y - height /2); 

    [[[self overlay] title] drawAtPoint:textstart withAttributes:fontAttributes]; 

    CGContextRestoreGState(context); 
    UIGraphicsPopContext(); 
} 
関連する問題