मैं कई कोर एनीमेशन CALayer
ऑब्जेक्ट्स होस्ट करने के लिए NSView
का उपयोग कर रहा हूं। मैं जो करने में सक्षम होना चाहता हूं वह दृश्य की वर्तमान स्थिति का एक स्नैपशॉट बिटमैप छवि के रूप में लेना है।मैं एक दृश्य प्रस्तुत कैसे करूं जिसमें कोर एनीमेशन परतों को बिटमैप में शामिल किया गया हो?
यह एक सामान्य 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:' विधि पहले देखा था, 'कैरेंडरर' ने मुझे बगीचे के पथ का नेतृत्व किया। –
क्या यह तत्व तत्वों के लिए ऑफस्क्रीन हैं? जैसे मेरे कैलियर में कुछ तत्व हैं जो अभी तक दृश्य फ्रेम में नहीं हैं, लेकिन मुझे उन्हें देखने के लिए स्क्रॉल करने की आवश्यकता है। – Tudorizer
क्या किसी ने इसे एनीमेशन के साथ काम करने के लिए प्राप्त किया है [UIView animateWithDuration: ...]? यह मेरे लिए सही नहीं रहा। – Isak