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

时间:2010-11-18 20:54:06

标签: iphone uiimage mapkit

我正在使用此函数将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 个答案:

答案 0 :(得分:8)

尝试使用UIGraphicsBeginImageContextWithOptions代替UIGraphicsBeginImageContext

UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);

有关详细信息,请参阅QA1703。它说:

  

注意:从iOS 4开始,   UIGraphicsBeginImageContextWithOptions   允许您提供比例   因子。比例因子为零设定它   到设备的比例因子   主屏幕。这使您可以获得   最尖锐,最高度的重新燃烧   显示的快照,包括一个   Retina Display。

答案 1 :(得分:0)

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];