我正在使用一個NSView
來承載多個Core Animation CALayer
對象。我想要做的就是將視圖當前狀態的快照作爲位圖圖像抓取。如何渲染包含Core Animation圖層的視圖到位圖?
這是一個正常的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
然而,當我使用此代碼,核心動畫層不會呈現。
我已經調查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 <CALayer: 0x1092ea0> is already attached to a context
我猜這一定是因爲該層樹在我NSView
主辦,因此附在其上下文中。我不明白如何從NSView
中分離圖層樹以將其渲染爲位圖,並且在這種情況下創建重複圖層樹不重要。
有一些其他的方式來獲得CALayer
s到渲染成位圖?我無法在任何地方找到任何示例代碼,實際上我根本找不到CARenderer
的任何示例代碼。
非常感謝,這正是我所需要的,完美的作品。我希望早些時候注意到'-renderInContext:'方法,'CARenderer'把我帶到花園的路上。 – 2009-12-31 02:32:41
這是否爲元素的工作是離屏?例如。我的CALayer包含一些不在視圖框架中的元素,但我需要滾動才能看到它們。 – Tudorizer 2011-07-12 15:34:35
有沒有人得到這個與[UIView animateWithDuration:...]開始的動畫一起工作?它不適合我。 – Isak 2013-07-01 19:52:26