2016-07-22 33 views
0

Ich bin Location-Sharing in meiner APP implementieren, dies zwingt mich, mehrere Snapshots entsprechend ihrer Breite und Länge entsprechend zu generieren. Also einfach direkt verwenden:Was ist der beste Weg, um einen Schnappschuss mit Längen- und Breitengrad zu erstellen, überspringen MKMapView ist wirklich ermutigt

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

wird mir einen unfertigen Snapshot führen.

Ich versuchte folgenden Code zu verwenden:

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 
    { 
     // Image creation code here 
    } 

Allerdings ist es schwer für mich auf der rechten Seite Zelle, um wieder einen Schnappschuss Einstellung auch ich weiß, dass es vollständig geladen ist.

Gibt es also eine API, um den Schnappschuss direkt aus der Breite und Länge ohne diese komplexe Prozedur zu generieren? Danke Jungs im Voraus!

Antwort

1

Sie können MKMapSnapshotter für diesen Zweck verwenden. Sie können ein Bild einer Karte an einem bestimmten Ort erstellen, der auf eine Region zentriert ist.

- (void)renderSnapshotForLocation:(CLLocationCoordinate2D)location { 
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init]; 
    options.size = CGSizeMake(200, 200); // whatever size you need 
    options.scale = [[UIScreen mainScreen] scale]; 
    // size of region in degrees of latitude and longitude 
    MKCoordinateSpan span = MKCoordinateSpanMake(0.25, 0.25); 
    options.region = MKCoordinateRegionMake(location, span); 

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options]; 
    [snapshotter startWithCompletionHandler:^(MKMapSnapshot * _Nullable snapshot, NSError * _Nullable error) { 
     if(snapshot){ 
      UIImage *mapImage = snapshot.image; 
      // do what you need with the image 
      return; 
     } 

     NSLog(@"Error rendering snapshot for map at: (%f, %f)", options.region.center.latitude, options.region.center.longitude); 
     NSLog(@"%@", error); 
    }]; 
} 

Es ist eine ziemlich good article on NSHipster über MKMapSnapshotter.

+0

Es ist gut, MKMapSnapshotter zu kennen, aber ich bin immer noch ein wenig verwirrt. mit einem [snapshotter startWithCompletionHandler: ^()] -Block in einer anderen Funktion renderSnapshotForLocation: (CLLocationCoordinate2D) Ort, wie kann ich Bild für die bestimmte Zelle in der UITableview zur richtigen Zeit setzen? –

+0

Das kommt drauf an - wann ist "die richtige Zeit"? Der Schnappschuss ist ziemlich schnell, ich verwende ihn, um Bilder zu laden, wenn sie benötigt werden, und die Verzögerung ist nicht so auffällig. Sie könnten die Signatur in 'renderSnapshotForlocation: (CLLocationCoordinate2D) location inCell: (UITableViewCell *) cell' ändern und das Bild für' cell' im Callback festlegen. Es klingt, als ob Sie etwas völlig synchrones wollen, aber ich bezweifle, dass Sie die Benutzeroberfläche wirklich blockieren wollen, bis die Kartenbilder gerendert sind. Starten Sie den Schnappschuss so schnell wie möglich und legen Sie das Bild dort ab, wo es benötigt wird. – dylansturg

+0

Danke, renderSnapshotForlocation: (CLLocationCoordinate2D) Standort inCell: (UITableViewCell *) Zelle ist was ich brauche :) –