渲染 MKMapView 到 NSImage

Render MKMapView to NSImage

我正在为我的四轴飞行器开发一个导航系统,我需要渲染一个航路点路线,显示在 MKMapViewNSImage供进一步使用。

到目前为止,这是我拥有的:


official documentation中可以看出,MKMapViewNSView的子类,因此我可以再次将其子类化以实现鼠标事件等

一切都按预期进行,最后的目标是 将该视图渲染到 NSImage 以供进一步使用,例如通过他们自己的图像浏览最喜欢的路线。


我对此做了一些研究,但没有找到我要找的东西。

我能够使用此方法渲染地图,但没有 Annotations/Overlays

- (NSImage *)captureMapView {

    __block NSImage *image;

    /* Note : self is my custom subclass of MKMapKit, where everything is */
    MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
    options.region = self.region;
    options.size = self.frame.size;

    MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];

    [snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
        image = snapshot.image;

    }];

    return image;

}

输出:


如您所知,路线不存在


更具体地说,圆圈由 MKPointAnnotation 组成,路线是 MKPolyline。注释(在我的例子中是圆圈)是通过 MKMapKit 方法 - addAnnotation: 添加的,而路由是用 - addOverlay:

添加的

我确实漏掉了什么。 感谢您的帮助。


尽管我认为从照片上看已经足够明显了,但我正在 OS X 10.11.4 上开发,Objective-C

10.8 之前 bitmapImageRepForCachingDisplayInRect: 运行良好。似乎在此版本之后它停止使用 Layer Backed 视图。 尝试以下操作:

+ (NSImage *)cacheImageForView:(NSView *)aView
{
    NSRect originRect = [aView convertRect:[aView bounds] toView:[[aView window] contentView]];

    NSRect rect = originRect;
    rect.origin.y = 0;
    rect.origin.x += [aView window].frame.origin.x;
    rect.origin.y += [[aView window] screen].frame.size.height - [aView window].frame.origin.y - [aView window].frame.size.height;
    rect.origin.y += [aView window].frame.size.height - originRect.origin.y - originRect.size.height;

    CGImageRef cgimg = CGWindowListCreateImage(rect,
                                           kCGWindowListOptionIncludingWindow,
                                           (CGWindowID)[[aView window] windowNumber],
                                           kCGWindowImageDefault);
    return [[NSImage alloc] initWithCGImage:cgimg size:[aView bounds].size];
}