我有一个从MKOverlayPathView继承的地图自定义视图。我需要这个自定义视图来显示圆,线和文本。
我已经设法使用路径绘制CGPathAddArc和CGPathAddLineToPoint函数绘制圆和线。
但是,我仍然需要添加文字。
我尝试使用
添加文字 [text drawAtPoint:centerPoint withFont:font];
但是我的上下文错误无效。
任何想法?
答案 0 :(得分:8)
使用MKOverlayPathView
,我认为添加文字的最简单方法是覆盖drawMapRect:zoomScale:inContext:
并将路径和文字绘图放在那里(并且不执行任何操作或不执行createPath
) 。
但是如果你打算使用drawMapRect
,你可能只想切换到普通MKOverlayView
而不是MKOverlayPathView
的子类。
使用MKOverlayView
覆盖drawMapRect:zoomScale:inContext:
方法并使用CGContextAddArc
(或CGContextAddEllipseInRect
或CGPathAddArc
)绘制圆圈。
您可以在此方法中使用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
的中心坐标或半径(或其他)发生变化时,您可以通过调用MKOverlayView
来setNeedsDisplayInMapRect:
“移动”(而不是删除和添加)再次叠加)。 (使用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