2011-10-19 28 views
10

我試圖在MKMapView上繪製一些包含文本的圓形覆蓋圖。 我已經subclassed 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

我正在計算文本的位置錯誤。 Hohum。 :P – Diziet

+2

如果有人需要它,這就是我如何將文本居中在圓圈中,考慮到文本的寬度和高度:'CGSize size = [str sizeWithFont:[UIFont fontWithName:@「Arial」size:9]]; CGPoint center = CGPointMake(circleRect.origin.x + circleRect.size.width /2,circleRect.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代替。

+0

非常感謝!它現在正在工作:)我忘了考慮縮放級別。我根據文本大小計算出圓的中心點和開始點,並使用drawAtPoint將其顯示爲完全居中。 – Templar

2

這很可能是您的文本被繪製爲不可見的矩形。

我會做的第一件事就是嘗試將值打印爲%f而不是%lf,因爲這些值看起來很瘋狂。您還應該打印出.size.width.size.height兩個矩形(mapRectoverallCGRect)。

如果這不會導致你一個明智的矩形定義,然後嘗試自己定義一個CGRect,如CGRectMake(0,0,100,20),看看文本是否繪製。

您也可以嘗試簡單地將填充的矩形繪製到您正在繪製文本的相同overallCGRect

3

這裏結合的答案和更新IOS7:下面

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