我正在为我的四轴飞行器开发导航系统,我需要渲染一条航路点路线,显示在 MKMapView
中,到 NSImage
以供进一步使用。
到目前为止,这就是我所拥有的:
<小时/>正如您从 official documentation 中看到的那样, MKMapView
是 NSView
的子类,因此我能够再次对其进行子类化以实现鼠标事件等。
一切都按预期进行,最后一个目标是将该 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;
}
输出:
<小时/>如您所知,路线不存在。
<小时/>更具体地说,圆圈由 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/