渲染 MKMapView 到 NSImage
Render MKMapView to NSImage
我正在为我的四轴飞行器开发一个导航系统,我需要渲染一个航路点路线,显示在 MKMapView
到 NSImage
供进一步使用。
到目前为止,这是我拥有的:
从official documentation中可以看出,MKMapView
是NSView
的子类,因此我可以再次将其子类化以实现鼠标事件等
一切都按预期进行,最后的目标是 将该视图渲染到 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];
}
我正在为我的四轴飞行器开发一个导航系统,我需要渲染一个航路点路线,显示在 MKMapView
到 NSImage
供进一步使用。
到目前为止,这是我拥有的:
从official documentation中可以看出,MKMapView
是NSView
的子类,因此我可以再次将其子类化以实现鼠标事件等
一切都按预期进行,最后的目标是 将该视图渲染到 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];
}