objective-c - 将 MKMapView 渲染为 NSImage

标签 objective-c cocoa maps mkmapview render

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

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

<小时/>

Runtime screenshot

正如您从 official documentation 中看到的那样, MKMapViewNSView 的子类,因此我能够再次对其进行子类化以实现鼠标事件等。

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

<小时/>

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

我能够使用此方法渲染 map ,但没有注释/叠加

- (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;

}

输出:

<小时/>

The output

如您所知,路线不存在

<小时/>

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

我确实错过了一些东西。 感谢您的帮助。

<小时/>

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

最佳答案

10.8 之前 bitmapImageRepForCachingDisplayInRect: 效果很好。似乎在此版本之后,它停止使用图层支持 View 。 请尝试以下操作:

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

关于objective-c - 将 MKMapView 渲染为 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204902/

相关文章:

objective-c - 我应该将通过 Interface Builder 进行的委托(delegate)引用设为 nil 吗?

iphone - 为什么 NSDate 不能使用 < 或 > 进行比较?

ios - 如何显示时间 08 :00:00 to 8 am using swift

objective-c - 如何在表格列中显示 NSDate

java - 当我在 google maps api V2 上使用 moveCamera 时我的应用程序崩溃

android - 如何在 Android 上使用谷歌地图或 mapquest 动态突出显示道路的一侧(或在旁边画一条线)

ios - 如何在 Xcode 6 调试器中访问隐藏/缩写的堆栈帧(堆栈跟踪缩写 slider 去了哪里?)

objective-c - 使用推送转换交换 NSView

javascript - 尝试使用 WebView 上的 JavaScript 按钮调用 C# 代码

objective-c - 如何计算两个地点之间的时差