Как отобразить представление, содержащее слои Core Animation, в растровое изображение?

Я используюNSView провести несколько основных анимацииCALayer объекты. То, что я хочу сделать, это сделать снимок видатекущее состояние как растровое изображение.

Это относительно просто с нормальнымNSView используя что-то вроде этого:

void ClearBitmapImageRep(NSBitmapImageRep* bitmap) {
    unsigned char* bitmapData = [bitmap bitmapData];
    if (bitmapData != NULL)
        bzero(bitmapData, [bitmap bytesPerRow] * [bitmap pixelsHigh]);
}

@implementation NSView (Additions)
- (NSBitmapImageRep*)bitmapImageRepInRect:(NSRect)rect
{
    NSBitmapImageRep* imageRep = [self bitmapImageRepForCachingDisplayInRect:rect];
    ClearBitmapImageRep(imageRep);
    [self cacheDisplayInRect:rect toBitmapImageRep:imageRep];
    return imageRep;
}
@end

Однако, когда я использую этот код, слои Core Animation не отображаются.

Я исследовалCARenderer, поскольку он, кажется, делает то, что мне нужно, однако я не могу заставить его отобразить существующее дерево слоев. Я попробовал следующее:

NSOpenGLPixelFormatAttribute att[] = 
{
    NSOpenGLPFAWindow,
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFAColorSize, 24,
    NSOpenGLPFAAlphaSize, 8,
    NSOpenGLPFADepthSize, 24,
    NSOpenGLPFANoRecovery,
    NSOpenGLPFAAccelerated,
    0
};

NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:att];
NSOpenGLView* openGLView = [[NSOpenGLView alloc] initWithFrame:[self frame] pixelFormat:pixelFormat];
NSOpenGLContext* oglctx = [openGLView openGLContext];

CARenderer* renderer = [CARenderer rendererWithCGLContext:[oglctx CGLContextObj] options:nil];
renderer.layer = myContentLayer;
[renderer render];
NSBitmapImageRep* bitmap = [oglView bitmapImageRepInRect:[oglView bounds]];

Однако, когда я делаю это, я получаю исключение: я

CAContextInvalidLayer -- layer is already attached to a context

Я предполагаю, что это должно быть потому, что дерево слоев находится в моемNSView и поэтому привязан к своему контексту. Я нене понимаю, как я могу отделить дерево слоев отNSView для того, чтобы отобразить его в растровое изображение, и этоНетривиально в этом случае создать дубликат дерева слоев.

Есть ли другой способ получитьCALayers для рендеринга в растровое изображение? Я могу'я не могу найти ни одного примера кода для этого, на самом деле я не могунайти любой пример кода дляCARenderer совсем.

Ответы на вопрос(2)

Ваш ответ на вопрос