使用真实分辨率将MKMapView渲染成UIImage

8
我正在使用这个函数将MKMapView实例渲染成图片:
@implementation UIView (Ext)
- (UIImage*) renderToImage
{
  UIGraphicsBeginImageContext(self.frame.size);
  [self.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext(); 
  return image;
}

这个正常工作。但是在iphone4上,呈现的图像分辨率与设备上实际分辨率不同。在设备上,我拥有640x920地图视图质量,而呈现的图像分辨率为320x460。然后我将提供给UIGraphicsBeginImageContext()函数的大小加倍,但这只填充了左上角的图像部分。
问题:有没有办法让地图呈现为具有完整分辨率640x920的图像?
2个回答

8
尝试使用UIGraphicsBeginImageContextWithOptions而不是UIGraphicsBeginImageContext:
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);

请参阅QA1703了解更多细节。文档表示:
注意:从iOS 4开始,UIGraphicsBeginImageContextWithOptions函数允许您提供一个比例因子。将比例因子设为零会将其设置为设备主屏幕的比例因子。这使您可以获取显示器的最清晰、最高分辨率的快照,包括Retina显示屏。

1
iOS 7引入了一种新的方法来生成MKMapView的屏幕截图。现在可以使用新的MKMapSnapshot API,如下所示:
MKMapView *mapView = [..your mapview..]

MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc]init];
options.region = mapView.region;
options.mapType = MKMapTypeStandard;
options.showsBuildings = NO;
options.showsPointsOfInterest = NO;
options.size = CGSizeMake(1000, 500);

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc]initWithOptions:options];
[snapshotter startWithQueue:dispatch_get_main_queue() completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    if( error ) {
        NSLog( @"An error occurred: %@", error );
    } else {
       [UIImagePNGRepresentation( snapshot.image ) writeToFile:@"/Users/<yourAccountName>/map.png" atomically:YES];
    }
}];

目前所有的覆盖层和注释都没有被渲染。您需要自己将它们渲染到生成的快照图像上。提供的MKMapSnapshot对象有一个方便的帮助方法来进行坐标和点之间的映射:

CGPoint point = [snapshot pointForCoordinate:locationCoordinate2D];

我在这行代码中遇到了错误 options.mapType = MKMapTypeStandard;,我该如何解决它? - Khushbu Desai
1
@KhushbuDesai 你在使用Swift吗? - Klaas
是的,我找到了解决方案 options.mapType = .standard - Khushbu Desai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接