有没有办法使用Paths Drawing添加文本

时间:2012-05-10 07:22:46

标签: ios mkmapview mkoverlay

我有一个从MKOverlayPathView继承的地图自定义视图。我需要这个自定义视图来显示圆,线和文本。

我已经设法使用路径绘制CGPathAddArc和CGPathAddLineToPoint函数绘制圆和线。

但是,我仍然需要添加文字。

我尝试使用

添加文字
 [text drawAtPoint:centerPoint withFont:font];

但是我的上下文错误无效。

任何想法?

2 个答案:

答案 0 :(得分:8)

使用MKOverlayPathView,我认为添加文字的最简单方法是覆盖drawMapRect:zoomScale:inContext:并将路径和文字绘图放在那里(并且不执行任何操作或不执行createPath) 。

但是如果你打算使用drawMapRect,你可能只想切换到普通MKOverlayView而不是MKOverlayPathView的子类。

使用MKOverlayView覆盖drawMapRect:zoomScale:inContext:方法并使用CGContextAddArc(或CGContextAddEllipseInRectCGPathAddArc)绘制圆圈。

您可以在此方法中使用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:“移动”(而不是删除和添加)再次叠加)。 (使用MKOverlayPathView时,您可以改为调用invalidatePath。)

调用setNeedsDisplayInMapRect:时,您可以传递地图rect参数的覆盖的boundingMapRect

在WWDC 2010的LocationReminders示例应用中,叠加视图使用KVO观察对相关MKOverlay的更改,并在检测到圆圈属性发生更改时自行移动,但您可以通过其他方式监控更改并从叠加视图外部明确调用setNeedsDisplayInMapRect:

<子> (在我使用MKOverlayPathView提到的另一个答案的评论中,这就是LocationReminders应用程序实现移动圆形叠加视图的方式。但我应该提到如何使用MKOverlayView绘制圆圈。对于那个很抱歉。)

答案 1 :(得分:1)

UIGraphicsPushContext推送上下文给我带来了问题。提醒方法drawMapRect:zoomScale:inContext:同时从不同的线程调用,因此我必须同步从UIGraphicsPushContext调用到UIGraphicsPopContext调用的那段代码。

同样在计算[UIFont systemFontOfSize:(5.0 * roadWidth)]中的字体大小时,应考虑[UIScreen mainScreen].scale,其中iPad,iPad2,iPhone3为1,而iPhone4 - 5和iPad3为{ {1}}。否则,文本大小将不同于iPad2到iPad3。

所以对我而言,结果如下:2