以圆形覆盖绘制文本

时间:2011-10-19 17:10:03

标签: iphone objective-c mkmapview overlay mkoverlay

我正在尝试在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

他们是正常的吗?我错过了什么?

感谢。

3 个答案:

答案 0 :(得分:12)

我相信您的代码正在运行,问题是文本没有正确缩放,使其无形。

使用zoomScale函数根据MKRoadWidthAtZoomScale缩放字体大小:

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

还要确保使用与底层圆圈颜色不同的文字颜色。

请注意,使用drawInRect会导致文本被限制在圈内,并可能会被截断。如果您想要始终显示所有文字,可以改用drawAtPoint

答案 1 :(得分:4)

将答案组合在一起并更新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();
}

答案 2 :(得分:2)

您的文字最有可能被绘制为不可见的矩形。

我要做的第一件事是尝试将值打印为%f而不是%lf,因为这些值看起来很疯狂。您还应打印.size.width.size.height两个字段(mapRectoverallCGRect)。

如果这不能引导您进行合理的矩形定义,那么请尝试自己定义CGRect,如CGRectMake(0,0,100,20),并查看文本是否绘制。

您还可以尝试将填充的矩形绘制为与绘制文本相同的overallCGRect