Jak renderować widok zawierający warstwy głównej animacji na mapę bitową?

UżywamNSView do obsługi kilku podstawowych animacjiCALayer przedmioty. Chcę zrobić zdjęcie stanu bieżącego widoku jako obrazu bitmapowego.

Jest to stosunkowo proste z normalnymNSView używając czegoś takiego:

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

Jednak gdy używam tego kodu, warstwy Animacji podstawowej nie są renderowane.

ZbadałemCARenderer, ponieważ wydaje się, że robi to, czego potrzebuję, jednak nie mogę go zmusić do renderowania mojego drzewa warstw. Próbowałem:

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]];

Jednak kiedy to robię, otrzymuję wyjątek:

CAContextInvalidLayer -- layer <CALayer: 0x1092ea0> is already attached to a context

Zgaduję, że musi to być spowodowane tym, że drzewo warstw jest hostowane w moimNSView i dlatego przywiązany do jego kontekstu. Nie rozumiem, jak mogę odłączyć drzewo warstw odNSView w celu renderowania go na mapę bitową i w tym przypadku nie jest banalne utworzenie duplikatu drzewa warstw.

Czy jest jakiś inny sposób na zdobycieCALayers do renderowania na mapę bitową? Nie mogę nigdzie znaleźć żadnego przykładowego kodu, w rzeczywistości nie mogę znaleźć żadnego przykładowego koduCARenderer w ogóle.

questionAnswers(2)

yourAnswerToTheQuestion