2012-08-12 22 views
6

मेरे पास एक ड्राइंग ऐप है और मैं चाहता हूं कि मेरे उपयोगकर्ता अपने ड्राइंग के हिस्से के रूप में कण प्रभावों का उपयोग करने में सक्षम हों। असल में, ऐप का बिंदु कस्टम ड्राइंग करना और कैमरा रोल में सहेजना या वर्ल्ड वाइड वेब पर साझा करना है।CAEmitterLayer rendering नहीं जब -renderInContext: सुपरलेयर के

मुझे हाल ही में CAEmitterLayer कक्षा का सामना करना पड़ा, जो मुझे लगता है कि कण प्रभाव जोड़ने के लिए एक सरल और प्रभावी तरीका होगा।

मैं CAEmitterLayer कार्यान्वयन का उपयोग कर ऐप में कणों को ऑनस्क्रीन खींचने में सक्षम हूं। तो ऑनस्क्रीन प्रतिपादन ठीक काम करता है।

मैं

CGContextRef context = UIGraphicsBeginImageContextWithSize(self.bounds.size); 

// The instance drawingView has a CAEmitterLayer instance in its layer/view hierarchy 
[drawingView.layer renderInContext:context]; 


//Note: I have also tried using the layer.presentationLayer and still nada 

.... 
//Get the image from the current image context here for saving to Camera Roll or sharing 


....the particles are never rendered in the image. 

का उपयोग कर रहा क्या सोचते ड्राइंग की सामग्री प्रतिपादन के बारे में जाना जब

CAEmitterLayer "एनिमेट" कणों की एक निरंतर राज्य में है हो रहा है। यही कारण है कि जब मैं परत प्रस्तुत करने का प्रयास करता हूं (मैंने layers.presentationLayer और मॉडललेयर प्रस्तुत करने का भी प्रयास किया है), एनिमेशन कभी भी प्रतिबद्ध नहीं होते हैं और इसलिए ऑफ स्क्रीन छवि रेंडर में कण नहीं होते हैं।

प्रश्न क्या किसी ने CAEmitterLayer ऑफ़स्क्रीन की सामग्री प्रदान की है? यदि ऐसा है, तो आपने यह कैसे किया?

वैकल्पिक प्रश्न क्या किसी को भी कण प्रभाव प्रणाली पुस्तकालयों के बारे में पता है जो OpenGL का उपयोग नहीं करते हैं और Cocos2D नहीं है?

+0

इसके साथ कोई भाग्य? –

+0

नहीं, नीचे रेविस जवाब देखें। CAEmitterLayer renderInContext को कॉल नहीं कर सकता: – micksabox

उत्तर

4

-[CALayer renderInContext:] कुछ साधारण मामलों में उपयोगी है, लेकिन अधिक जटिल स्थितियों में अपेक्षित काम नहीं करेगा। आपको अपनी ड्राइंग करने के लिए कुछ और तरीका ढूंढना होगा।

The documentation for -[CALayer renderInContext:] का कहना है:

मैक OS X v10.5 इस विधि के कार्यान्वयन नहीं है समर्थन पूरे कोर एनिमेशन रचना मॉडल। QCCompositionLayer, CAOpenGLLayer, और QTMovieLayer परत प्रस्तुत नहीं हैं। इसके अतिरिक्त, 3 डी ट्रांसफॉर्म का उपयोग करने वाली परतें प्रदान नहीं की जाती हैं, न ही परतें निर्दिष्ट करती हैं जो पृष्ठभूमि फ़िल्टर, फ़िल्टर, कंपोजिटिंग फ़िल्टर या मास्क मान निर्दिष्ट करती हैं। मैक ओएस एक्स के भविष्य संस्करण इन परतों और गुणों को प्रस्तुत करने के लिए समर्थन जोड़ सकते हैं।

(ये सीमाएं आईओएस पर भी लागू होती हैं।)

हैडर CALayer.h भी कहते हैं:

* WARNING: currently this method does not implement the full 
* CoreAnimation composition model, use with caution. */ 
+0

अच्छी तरह से कहा गया है! अन्य लोग ऐसा करना चाहते हैं, पिक्सेल को पकड़ने के लिए कुछ अनियंत्रित तरीका है लेकिन निश्चित रूप से आप इसे सबमिट किए गए ऐप में कभी भी उपयोग नहीं कर सकते। मुझे आश्चर्य है कि क्या आप किसी भी तरह बिटमैप संदर्भ में एक समान परत जोड़ सकते हैं, और फिर उसे पकड़ लें? ऐसा नहीं होगा कि उपयोगकर्ता ने देखा लेकिन शायद आप कुछ ऐसा ही प्राप्त कर सकते हैं? –

+0

क्या आप इसे करने के लिए कोई अनियंत्रित तरीका जानते हैं? – Chris

0

मैं अपने CAEmitterLayer एक छवि के रूप में एक वर्तमान संदर्भ में

Swift 

func drawViewHierarchyInRect(_ rect: CGRect, 
      afterScreenUpdates afterUpdates: Bool) -> Bool 



Objective-C 

- (BOOL)drawViewHierarchyInRect:(CGRect)rect 
      afterScreenUpdates:(BOOL)afterUpdates 

साथ अपने वर्तमान एनीमेशन राज्य में सही ढंग से प्रदान की गई करने के लिए कर रहा था

UIGraphicsBeginImageContextWithOptions(size, false, 0) 

और बाद में स्क्रीन अपडेट के बाद सेट करें | हाँ

उस के साथ शुभकामनाएं: डी

+1

हम इसका उपयोग कर सकते हैं लेकिन CAEmitterLayer दूसरे स्क्रीनशॉट से धीमा हो जाएगा। – Uttam