使用MKPolylineRenderer创建MKMapSnapshotter [英] Creating an MKMapSnapshotter with an MKPolylineRenderer
问题描述
我认为iOS 7的 MKMapSnapshotter
s是获取 MKMapView
快照的简单方法,其好处是你可以做到这一点,而无需将地图加载到视图中。即使添加引脚和覆盖图似乎更多工作(因为需要核心图形)。 WWDC视频提供了一个非常好的示例,通过添加 MKAnnotationView
来创建 MKMapSnapshotter
。
I thought iOS 7's MKMapSnapshotter
s would be a simple way to take a snapshot of an MKMapView
, the benefit is that you can do it without loading the map into view. Even though it seems like more work to add pins and overlays (because of the need for core graphics). The WWDC videos give a very good example of creating an MKMapSnapshotter
with adding an MKAnnotationView
.
然而,对于没有很多核心图形经验的人来说,如何从创建
。 MKMapSnapshotter
并不是很明显MKPolylineRenderer
However, for someone with not a lot of core graphics experience it's not really obvious how you create an MKMapSnapshotter
from an MKPolylineRenderer
.
我试过这样做,但路径不准确。它准确地绘制了大约10%的线,但随后直接绘制了剩下的路径。
I have tried to do this, but the path is inaccurate. It draws about 10% of the line accurately, but then draws the rest of the path straight.
这是我的代码:
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:snapshotOptions];
[snapshotter startWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
completionHandler:^(MKMapSnapshot *snapshot, NSError *error)
{
if (error == nil)
{
UIImage *mapSnapshot = [snapshot image];
UIGraphicsBeginImageContextWithOptions(mapSnapshot.size,
YES,
mapSnapshot.scale);
[mapSnapshot drawAtPoint:CGPointMake(0.0f, 0.0f)];
CGContextRef context = UIGraphicsGetCurrentContext();
//Draw the points from the MKPolylineRenderer in core graphics for mapsnapshotter...
MKPolylineRenderer *overlay = (MKPolylineRenderer *)[self.mapView rendererForOverlay:[_mapView.overlays lastObject]];
if (overlay.path)
{
CGFloat zoomScale = 3.0;
[overlay applyStrokePropertiesToContext:context
atZoomScale:zoomScale];
CGContextAddPath(context, overlay.path);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextStrokePath(context);
}
UIImage *pathImage = UIGraphicsGetImageFromCurrentImageContext();
[map addMapIcon:pathImage];
UIGraphicsEndImageContext();
}
}];
有没有人有一个很好的可行的例子来讨论如何做到这一点?
Does anyone have a good workable example on how to do this please?
推荐答案
刚遇到同样的问题,这段代码似乎有效:
Just had the same problem, this code seems to work:
UIImage * res = nil;
UIImage * image = snapshot.image;
UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale);
[image drawAtPoint:CGPointMake(0, 0)];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [COLOR_FLASHBLUE CGColor]);
CGContextSetLineWidth(context,2.0f);
CGContextBeginPath(context);
CLLocationCoordinate2D coordinates[[polyline pointCount]];
[polyline getCoordinates:coordinates range:NSMakeRange(0, [polyline pointCount])];
for(int i=0;i<[polyline pointCount];i++)
{
CGPoint point = [snapshot pointForCoordinate:coordinates[i]];
if(i==0)
{
CGContextMoveToPoint(context,point.x, point.y);
}
else{
CGContextAddLineToPoint(context,point.x, point.y);
}
}
CGContextStrokePath(context);
res = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
这篇关于使用MKPolylineRenderer创建MKMapSnapshotter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!