2012-06-18 12 views
9

मेरे पास CATiledLayer बैकिंग के साथ एक दृश्य है। मैं इस CATiledLayer UIView से दृश्यमान टाइल्स लेना चाहता हूं और इसे अपने कैलियर बैकिंग के रूप में किसी अन्य दृश्य में जोड़ना चाहता हूं, इस प्रकार एक अन्य UIView में दिखाई देने वाली छवि को पुनर्निर्मित करना जो CATiledLayer का उपयोग नहीं करता है।CATiledLayer से CALayer

कारण मैं यह करना चाहता हूं कि मैं इस दूसरे UIView का उपयोग CATiledLayer समर्थित UIView को अद्यतन करने के प्रभाव को मुखौटा करने के लिए करूंगा - यह वर्तमान में एक झिलमिलाहट पैदा करता है क्योंकि सभी टाइल्स फिर से लोड हो जाते हैं।

समस्या मैं पूरी तरह मैं यह कैसे करना होगा यकीन नहीं है। कोई विचार?

+1

तो तुम एक जानबूझकर टाइलों दृश्य लेने के लिए और टाइलों दृश्य को छिपाने के लिए एक सामान्य दृश्य बनाना चाहते हैं ...? शायद एक पागल सवाल लेकिन यह शुरू करने के लिए क्यों टाइल किया गया था? –

+0

@PauldeLange - जब मेरे टाइल दृश्य को फिर से लोड किया जाता है तो टाइल्स फिर से खींचे जाते हैं। टाइल किए गए दृश्य के नीचे एक UIView होगा जो उपरोक्त टाइल्स की सीधी प्रति होगी। फिर जब टाइल्स को पुनः लोड किया जाता है, तो नीचे का दृश्य एक अलग सेकेंड के लिए दिखाया जाएगा क्योंकि टाइल्स को फिर से लोड किया जाता है, इस प्रकार झिलमिलाहट को रोकता है। मैं यह कह सकता हूं कि ग्राफिक्स प्रोग्राम के लिए यह एक आम बात है - ग्राफिक बफर का उपयोग करके उपरोक्त किसी भी नई सामग्री को प्रस्तुत करने के प्रभाव को सुगम बनाने के लिए। –

+0

यदि आप टाइल्स की तुलना में पृष्ठभूमि दृश्य को तेज़ी से प्रस्तुत कर सकते हैं, तो आपके पास टाइल्स क्यों हैं? प्रभावित -> रास्ते से प्रभाव। –

उत्तर

3

CATiledLayer CALayer का एक उपवर्ग का एक तरीका प्रदान एसिंक्रोनस रूप से परत की सामग्री की टाइल्स, संभवतः विस्तार के कई स्तरों पर कैश्ड प्रदान करना है।

आप के साथ एक CGContextRef में परत में दिखाई बातें प्रदान कर सकते हैं:

- (void)renderInContext:(CGContextRef)ctx 

और फिर अपने प्रतिनिधि सेटिंग्स द्वारा अपने अन्य परत अद्यतन करने के लिए इस का उपयोग करें और लागू करने

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 

एसएस दिखाया गया है http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

लेकिन ईमानदारी से मुझे नहीं लगता कि यह कुशल है।

+0

उत्तर के लिए धन्यवाद। आप कहते हैं कि यह कुशल नहीं है। क्या आपके पास कोई अन्य विचार है जो मेरी झिलमिलाहट की समस्या को हल करने में मदद कर सकता है? –

+0

@Luis 'renderInContext'' CATiledLayer' पर काम नहीं कर रहा है क्योंकि 'CALAYER' मेरे लिए करता है। टाइल्स बिल्कुल प्रस्तुत नहीं करते हैं। कोई विचार? – Tim

0

आपकी असली समस्या यहां झटकेदार है। मैं इसे समर्थन एक कस्टम CALayer के साथ एक दृश्य पर एक समान समस्या थी, इस समाधान का हिस्सा था: अपने CALayer के एक कस्टम उपवर्ग बनाएँ और निम्न विधि को लागू:

- (void) display { 
    self.contents = nil; 
    [super display]; 
} 

इस के लिए समस्याओं का एक सेट तय मैं, लेकिन यह आपके लिए ठीक नहीं हो सकता है। आप के लिए विकल्प के लेन-देन को निष्क्रिय करने, जबकि आप अद्यतन हो सकता है: से CATransaction Class Reference

setDisableActions: सेट करती है कि कार्रवाई संपत्ति इस लेन-देन समूह को दबा दिया जाता है में होने वाले परिवर्तनों के परिणामस्वरूप शुरू हो गया।

तो यह उपयोग करने के लिए:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
// do updating/flickering stuff 
[self doFlickeringThing]; 
[CATransaction commit]; 
संबंधित मुद्दे