代码之家  ›  专栏  ›  技术社区  ›  user4034591

像iMessage这样的URL缩略图表示位置的最佳方式是什么?[已关闭]

  •  1
  • user4034591  · 技术社区  · 8 年前

    我需要一个可点击的缩略图来指示位置,就像iMessage一样,实现这一点的最佳方式是什么?

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  1
  •   n00bProgrammer    8 年前

    您可以添加 MKMapView 到您的表单元格,但更好的方法是使用 MKSnapshotter 以创建快照并将其添加到单元格中。

    从…起 NSHipster公司 的博客帖子 here ,从中检索图像的示例代码 MKMapSnapshotter 是:

    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 传递给快照的是 MKMapSnapshotOptions

    MKMap快照器 也足够灵活,可以向快照添加默认/自定义注释,正如您在问题中所述。

    来自同一来源并带有注释的示例代码是:

    [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();
    }];
    

    这里的关键是,您必须使用自定义代码从快照创建图像。

    生成快照后,可以在单元格内绘制快照。

    如果要进一步优化,可以将生成的快照保存在本地存储中,并将其用于相同坐标的单元重用,而不是在每次重用单元时生成图像。

    阅读官方文档 MKMap快照器 HERE MKSnapshotOptions HERE .