0

を別のものに置き換えるためのカスタムアニメーションを作成しようとしていNSViewます。そのためNSView、画面に表示される前に画像を取得する必要があります。

ビューにはレイヤーとNSOpenGLViewサブビューが含まれている可能性があるため、この場合のような標準オプションはうまく機能しません(私の実験ではレイヤーまたはOpenGLコンテンツがうまく機能します)initWithFocusedViewRectbitmapImageRepForCachingDisplayInRect

レイヤーやOpenGLコンテンツを含むCGWindowListCreateImageオフラインを「キャプチャ」できるようなものを探しています。NSWindow

助言がありますか?

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 に答える