2009-06-07 10 views
5

यहां मेरा सेटअप है: मेरे पास एक सीएएलएयर है जिसमें मैं सब्लेयर जोड़ना चाहता हूं। मैं उबाला को स्थापित करके और फिर यूआईएलएबल परत को अपनी मुख्य परत में जोड़कर इन सबबेलर्स बना देता हूं। बेशक यह पृष्ठभूमि में चारों ओर घूमने वाली भारी UILabel ऑब्जेक्ट छोड़ देता है। क्या UIView से अपनी सभी सामग्री के साथ परत प्राप्त करना संभव है और UIView से छुटकारा पाएं?UIView से कैलियर की प्रतिलिपि बनाना संभव है?

UILabel* label; 
[...] 
[mainLayer addSublayer:[label.layer copy]]; 
[label release]; 

लेकिन जब भी मैं UIView जारी, परत की सामग्री भी हटा दिया जाता है: मैं पहले से ही इस की कोशिश की। क्या यह भी संभव है या UIView की परत को हमेशा इसकी सामग्री दिखाने के लिए UIView की आवश्यकता है? मैंने परत को कैनवास के रूप में सोचा, जिस पर UIView पेंट्स। मुझे लगता है कि मैं इस धारणा के साथ गलत हो सकता है :)

उत्तर

1

यह संभव नहीं है: एक परत UIView की एक संपत्ति है। इसलिए, जब आप UIView को छोड़ते हैं, तो इसकी परत समाप्त हो जाती है। एक प्रकार के कैनवास के रूप में परत के बारे में सोचने का आपका विचार गलत नहीं है। लेकिन, परत अपने UIView का एक अभिन्न हिस्सा है।

4

मुझे समझ में नहीं आता कि आप एक परत की प्रतिलिपि क्यों नहीं कर पाएंगे। सच है एक परत UIView का एक "अभिन्न हिस्सा" है। लेकिन अंत में यह कई गुणों के साथ एक और वस्तु है।

असल में वहाँ बुलाया CALayer के लिए एक विधि है:

- (id)initWithLayer:(id)layer 

लेकिन यह एक परत की एक प्रतिलिपि बनाने के लिए इरादा नहीं है। (आप तर्क के लिए एप्पल के डॉक्स पढ़ सकते हैं क्यों)

CALayer NSCopying के अनुरूप नहीं है, तो आप दो विकल्प हैं:

  1. यह उपवर्ग और लागू "copyWithZone:" (और के अनुरूप NSCopying)
  2. एक विधि/समारोह है कि का जो रास्ता आप चुनते हैं भले ही एक CALayer

की एक "कॉपी" वापस आ जाएगी लिखें, सवाल पूछने के लिए है: में से कौन सा गुण क्या आप कॉपी करना चाहते हैं?

मान लीजिए कि आप सिर्फ सामग्री और फ्रेम की प्रतिलिपि बनाना चाहते हैं:

CALayer copyLayer = [CALayer layer]; 

copyLayer.contents = theLayerToBeCopied.contents; 
copyLayer.frame = theLayerToBeCopied.frame; 

return copyLayer; 

आप के माध्यम से जाने के लिए और परत के हर संपत्ति नकल कर सकता है, या फिर आप उन्हें जरूरत है कॉपी। एक कैलियर श्रेणी में डालने के लिए एक अच्छी विधि हो सकती है।

+1

शायद क्योंकि एक परत के प्रयोजन उसके संबंधित UIView और उसके sublayers रेंडर करने के लिए है दोहराने के लिए सक्षम हो जाएगा। यदि UIView गायब हो जाता है क्योंकि आप इसे छोड़ देते हैं, तो आपको उस परत का उपयोग करने की आवश्यकता क्यों होगी जो मूल रूप से उस UIView से जुड़ा हुआ था? यदि आपको वास्तव में एक परत की आवश्यकता है तो यह मेरे लिए तार्किक प्रतीत होता है कि आपको इसके UIView की भी आवश्यकता है।हेंट्ज निश्चित रूप से आपके द्वारा सुझाए गए दृष्टिकोण का प्रयास कर सकता है (और मुझे यकीन नहीं है कि यह काम करेगा या नहीं), लेकिन मैंने इसे कोर एनीमेशन कोड में पहले नहीं देखा है। इसके अलावा, अगर ऐप्पल ने इसे संभव बनाने के बारे में सोचा था, तो यह नेलेयर को एनएससीपीआईपी के साथ अनुपालन करता। अगर यह दृष्टिकोण काम करता है या नहीं तो कृपया मुझे बताएं। –

+0

एक कैलियर की प्रतिलिपि बनाने के लिए मैं देख सकता हूं कि एकमात्र कारण यह है कि उसे स्क्रीन पर एक ही परत के गुणकों को प्रदर्शित करने की आवश्यकता होती है। मुझे लगता है कि आमतौर पर आप कई परतों को बनाने के बारे में सोचेंगे जैसे आपने पहले बनाया था। हालांकि, मुझे नहीं लगता कि अगर आप पहले को नष्ट करने का इरादा रखते हैं तो आप एक प्रतिलिपि क्यों बनायेंगे। मेरी सोच यह थी कि उसे वास्तव में "प्रतिलिपि" की आवश्यकता नहीं थी जितनी उसे मूल के समान गुणों के साथ एक परत की आवश्यकता थी। आप सही हैं क्योंकि इसमें समस्या का स्वीकार्य समाधान नहीं है, लेकिन यह देखना दिलचस्प है कि यह कैसे काम करता है। –

0

उइलाबेल वास्तव में एक बहुत ही जटिल नियंत्रण नहीं है। मेरा सुझाव है कि आप हमले की इस पंक्ति को छोड़ दें और जानें कि क्वार्ट्ज का उपयोग करके आप जो ताजा CGImage में उपयोग करना चाहते हैं उसे आकर्षित करना है। इसके बाद आप इसे अन्य सभी सामानों के बारे में चिंता किए बिना कैलियर की सामग्री संपत्ति को असाइन कर सकते हैं।

0

आप पूरी तरह से UILabel को बाधित कर सकते हैं और CATextLayer के साथ अपना टेक्स्ट बना सकते हैं।

0

उपयोग CAReplicatorLayer, तो आप पूरी तरह से उस परत

संबंधित मुद्दे