Ich benötige ein anklickbares Thumbnail, um den Ort anzugeben, genau wie iMessage, was ist der beste Weg, um das zu erreichen?Was ist die beste URL, um eine Miniaturansicht wie iMessage anzuzeigen?
Antwort
Sie können eine MKMapView
auf Ihre Tabellenzelle hinzufügen, aber die bessere Möglichkeit, Schnappschüsse zu gehen wäre MKSnapshotter
zu verwenden, zu erstellen und das Hinzufügen sie stattdessen auf Ihre Zellen.
Von NSHipster ‚s Blog-Post here, Codebeispiel Bild zum Abrufen von einem MKMapSnapshotter
ist:
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
options.region = self.mapView.region;
options.size = self.mapView.frame.size;
options.scale = [[UIScreen mainScreen] scale];
NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/snapshot.png"];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
if (error) {
NSLog(@"[Error] %@", error);
return;
}
UIImage *image = snapshot.image;
NSData *data = UIImagePNGRepresentation(image);
[data writeToURL:fileURL atomically:YES];
}];
options
auf den Snapshot hier MKMapSnapshotOptions
sind vergangen. Lesen Sie den Blog für weitere Informationen und vollständige Anleitung.
MKMapSnapshotter
ist auch flexibel genug, um Standard/benutzerdefinierte Anmerkungen zu den Schnappschüssen hinzuzufügen, wie Sie in Frage gestellt haben.
Beispielcode aus der gleichen Quelle, mit Anmerkung ist:
[snapshotter startWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
if (error) {
NSLog(@"[Error] %@", error);
return;
}
MKAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:nil];
UIImage *image = snapshot.image;
UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale);
{
[image drawAtPoint:CGPointMake(0.0f, 0.0f)];
CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
for (id <MKAnnotation> annotation in self.mapView.annotations) {
CGPoint point = [snapshot pointForCoordinate:annotation.coordinate];
if (CGRectContainsPoint(rect, point)) {
point.x = point.x + pin.centerOffset.x -
(pin.bounds.size.width/2.0f);
point.y = point.y + pin.centerOffset.y -
(pin.bounds.size.height/2.0f);
[pin.image drawAtPoint:point];
}
}
UIImage *compositeImage = UIGraphicsGetImageFromCurrentImageContext();
NSData *data = UIImagePNGRepresentation(compositeImage);
[data writeToURL:fileURL atomically:YES];
}
UIGraphicsEndImageContext();
}];
Tha Fang hier ist, werden Sie ein Bild aus dem Snapshot mit benutzerdefinierten Code erstellen müssen.
Sobald der Snapshot erstellt wurde, können Sie ihn in Ihrer Zelle darstellen.
Wenn Sie dies weiter optimieren möchten, können Sie den generierten Snapshot im lokalen Speicher speichern und ihn bei der Wiederverwendung von Zellen für dieselben Koordinaten verwenden, anstatt jedes Mal ein Bild zu generieren, wenn die Zelle erneut verwendet wird.
Lesen Sie die offizielle Dokumentation für MKMapSnapshotter
HERE und MKSnapshotOptions
HERE.
Vielen Dank für die detaillierte Erklärung, schätze es! –