user1162866
user1162866

Reputation: 33

Taking a screenshot of MKMapView

I'm trying to get a screenshot of a MKMapView.

and I'm using the following code:

UIGraphicsBeginImageContext(myMapView.frame.size);

[myMapView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenShot=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return screenShot;

And I'm getting and almost blank image with the map current location icon and a Google logo in it.

What could be causing that?

I should tell you that myMapView is actually on another viewController's view but since I'm getting the blue spot showing the location and the google logo I assume the reference I have is the correct one.

Thank you.

Upvotes: 1

Views: 3608

Answers (2)

Klaas
Klaas

Reputation: 22763

iOS 7 introduced a new method to generate screenshots of a MKMapView. It is now possible to use the new MKMapSnapshot API as follows:

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

Currently all overlays and annotations are not rendered. You have to render them afterwards onto the resulting snapshot image yourself. The provided MKMapSnapshot object has a handy helper method to do the mapping between coordinates and points:

CGPoint point = [snapshot pointForCoordinate:locationCoordinate2D];

Upvotes: 4

chatur
chatur

Reputation: 2363

As mentioned here, you can try this

- (UIImage*) renderToImage
{
   UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
   [self.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext(); 
  return image;
}

Upvotes: 2

Related Questions