0

我正在尝试制作一个自定义动画来替换NSView另一个。出于这个原因,我需要NSView在它出现在屏幕上之前获取它的图像。

视图可能包含图层和NSOpenGLView子视图,因此标准选项initWithFocusedViewRectbitmapImageRepForCachingDisplayInRect在这种情况下不能很好地工作(它们在我的实验中很好地分层或 OpenGL 内容)。

我正在寻找类似的东西CGWindowListCreateImage,它能够“捕获”NSWindow包括图层和 OpenGL 内容在内的离线内容。

有什么建议么?

4

1 回答 1

2

我为此创建了一个类别:

@implementation NSView (PecuniaAdditions)

/**
 * Returns an offscreen view containing all visual elements of this view for printing,
 * including CALayer content. Useful only for views that are layer-backed.
 */
- (NSView*)printViewForLayerBackedView;
{
    NSRect bounds = self.bounds;
    int bitmapBytesPerRow = 4 * bounds.size.width;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
    CGContextRef context = CGBitmapContextCreate (NULL,
                                                  bounds.size.width,
                                                  bounds.size.height,
                                                  8,
                                                  bitmapBytesPerRow,
                                                  colorSpace,
                                                  kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorSpace);

    if (context == NULL)
    {
        NSLog(@"getPrintViewForLayerBackedView: Failed to create context.");
        return nil;
    }

    [[self layer] renderInContext: context];
    CGImageRef img = CGBitmapContextCreateImage(context);
    NSImage* image = [[NSImage alloc] initWithCGImage: img size: bounds.size];

    NSImageView* canvas = [[NSImageView alloc] initWithFrame: bounds];
    [canvas setImage: image];

    CFRelease(img);
    CFRelease(context);
    return canvas;
}

@end

此代码主要用于打印包含分层子视图的 NSView。也能帮到你。

于 2013-04-24T12:23:01.443 回答