可可:如何渲染视图到图像?

NOr*_*der 8 macos cocoa

我想知道是否有任何方法来渲染图像的视图?就像截图一样,但我可以为该方法指定任何视图.我知道如何在ios中做到这一点.保存视图内容,但是如何在mac os中完成?

Rem*_*rrr 15

有几种方法,但不是很完美.许多问题都与Layer Backed视图有关.

如果您没有图层支持或托管视图,则可以使用以下代码:

    NSData* data = [mainView dataWithPDFInsideRect:[mainView bounds]];
    NSImage *img = [[NSImage alloc] initWithData:data];
Run Code Online (Sandbox Code Playgroud)

如果您使用基于图层的视图:

直到10.8对我来说最好的方式是

        NSSize mySize = mapImage.bounds.size;
        NSSize imgSize = NSMakeSize( mySize.width, mySize.height );
        NSBitmapImageRep *bir = [mapImage bitmapImageRepForCachingDisplayInRect:[mapImage bounds]];
        [bir setSize:imgSize];
        [mapImage cacheDisplayInRect:[mapImage bounds] toBitmapImageRep:bir];
        caheImg = [[NSImage alloc]initWithSize:imgSize];
        [caheImg addRepresentation:bir];
Run Code Online (Sandbox Code Playgroud)

但在10.8 bitmapImageRepForCachingDisplayInRect停止使用Layer Backed视图.

您可以选择制作屏幕截图并剪切视图:

+ (NSImage*) screenCacheImageForView:(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];
}
Run Code Online (Sandbox Code Playgroud)