2009-11-10 12 views
12

सभी,सामग्री खींचने से पहले CATiledLayer रिक्त टाइल्स

मुझे कैटिल्डलेयर से व्यवहार करने में परेशानी हो रही है। क्या कोई तरीका है कि मैं टाइल्स को फिर से प्रभावित करने के बिना ट्रिगर कर सकता हूं कि उनके क्षेत्र पहले सफेद हो जाएं?

  • मैं एक है: मैं पहले से ही CATiledLayer fadeDuration स्थापित करने के लिए वापस जाने के लिए 0.

    अधिक विशिष्ट होना करने के लिए, यहाँ मैं क्या मैं देख रहा हूँ और क्या हासिल करना कोशिश कर रहा हूँ की जानकारी दी जा रही subclassed गए एक बड़ी सामग्री आकार के साथ UIScrollView ... ~ 12000x800। इसकी सामग्री दृश्य एक UIView है जिसे CATiledLayer द्वारा समर्थित किया गया है।

  • UIView को कई कस्टम-खींची गई लाइनों
  • सबकुछ ठीक काम करता है, लेकिन कभी-कभी UIView की सामग्री बदल जाती है। जब ऐसा होता है, तो मैं टाइल्स को यथासंभव निर्बाध रूप से दोबारा बनाना चाहता हूं। जब मैं दृश्य पर setNeedsDisplay का उपयोग करता हूं, तो टाइल्स फिर से चला जाता है लेकिन उन्हें पहले सफेद रंग में साफ़ कर दिया जाता है और नई सामग्री तैयार होने से पहले एक सेकंड की देरी होती है। मैंने पहले से ही CATiledLayer को उपclass कर दिया है ताकि fadeDuration 0
  • जो व्यवहार मैं चाहता हूं वह ऐसा होना चाहिए ... जब आप स्क्रॉलव्यू पर ज़ूम इन करते हैं और सामग्री को उच्च रिज़ॉल्यूशन पर फिर से खींचा जाता है, तो वहां कोई नहीं है रेड्रो से पहले खाली करना; नई सामग्री को पुराने के शीर्ष पर खींचा जाता है। यही वह है जिसे मैं ढूंढ रहा हूं।

धन्यवाद; मैं आपके विचारों की सराहना करता हूं।

अद्यतन:

बस का पालन करने के लिए - मैंने महसूस किया कि टाइल्स redraw से पहले सफेद करने के लिए साफ नहीं किया जा रहा था, वे पूरी तरह से बाहर ले जाया जा रहा हो; जो सफेद मैं देख रहा था वह दृश्य का रंग है जो मेरे कैटिल्डलेयर बैकड व्यू के नीचे है।

एक त्वरित हैक/फिक्स के रूप में, मैंने UISmrollView के नीचे UIImageView लगाया है, और CATiledLayer-समर्थित दृश्य के एक रेड्रो को ट्रिगर करने से पहले मैं इसे दृश्य अनुभाग को UIImageView में प्रस्तुत करता हूं और इसे दिखाता हूं। यह रेड्रो काफी महत्वपूर्ण बनाता है।

यदि किसी के पास बेहतर समाधान है, तो पहले स्थान पर फिर से खींचे जाने से पहले रेड्रो-लक्षित टाइल्स को दूर जाने से रोकना, मुझे अभी भी यह सुनना अच्छा लगेगा।

+0

मुझे क्षमा करें। लेकिन "कैटिल्डलेयर बैकड व्यू के रेड्रो को ट्रिगर करने से पहले" कब होता है ?? 'drawLayer: inContext:'? – Yeung

उत्तर

1

आप मौजूदा टाइल परत के पीछे एक और परत (संभवतः एक कैटिल्डलेयर) जोड़ सकते हैं। (एक डबल-बफर किए गए समाधान का क्रमबद्ध करें।) आप एक टाइमर से दूसरी परत पर setNeedsDisplay: पर कॉल करेंगे जो कुछ सेकंड के बाद आग लगती है ताकि यह सुनिश्चित किया जा सके कि वह परत सामने की परत के समान समय में नहीं रुकती है।

+0

कैटिल्स ड्रॉ नहीं करते हैं अगर वे दिखाई नहीं दे रहे हैं (कुछ या ऑफस्क्रीन के पीछे) –

1

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

मैं देखना चाहता हूं कि कैसे आप अपना आवेदन लागू करते हैं। मैं ऐसे उदाहरण ढूंढने के लिए हफ्तों की तलाश में हूं जो UIScrollView के संयोजन का उपयोग करता है और कई कस्टम खींची गई रेखाओं के साथ एक कैटिल्डलेयर-बैक व्यू का उपयोग करता है। ऐप्पल में कुछ शानदार नमूना कोड है - लेकिन इसमें सभी लाइन कला की बजाय छवियां शामिल हैं, इसलिए मेरे लिए कोई मदद नहीं है।

0

मुझे आईपैड के साथ एक ही समस्या थी।

समाधान अधिक सरल से मैंने सोचा और कहीं अधिक redrawing से पहले प्रदर्शन प्रस्तुत करना UIImageView का उपयोग करने से आसान था ...:

बस परत के लिए किसी भी पृष्ठभूमि रंग सेट नहीं है!

layer = [[CATiledLayer alloc] init]; 
layer.masksToBounds = YES; 
layer.contentsGravity = kCAGravityLeft; 

//layer.backgroundColor = [[UIColor whiteColor] CGColor]; 

layer.tileSize = CGSizeMake(1004.0, 1004.0); 
layer.levelsOfDetail = 16; 
layer.levelsOfDetailBias = 8; 

ध्यान दें कि मैं सफेद करने के लिए लाइन की स्थापना परत की पृष्ठभूमि का रंग बाहर टिप्पणी की है:

मैं एक समान तरीके से CATiledLayer सेट था। उसके बाद रेड्रो समस्या से पहले सफेद खाली गायब हो गया!

अगर किसी ने कोशिश की है तो मुझे बताएं।

+0

यह मेरे लिए काम नहीं करता है, फिर से ड्रॉ से पहले रिक्त टाइल्स पर पृष्ठभूमि रंग को हटाने पर कोई प्रभाव नहीं पड़ता है। –

3

मुझे पता चला है कि यदि आप स्तरों को सेट करते हैं तो ओवरफैंटबियास और स्तर दोनों एक ही मान (2 मेरे मामले में) में दोहराएं, तो यह केवल मेरे सेटडिड्स द्वारा छूए गए टाइल्स को दोबारा हटा देता है, जैसा कि आप उम्मीद करेंगे।

हालांकि यदि स्तर ODDetail LODB के लिए अलग है, तो सेट करने के लिए कोई भी कॉलडिड्स डिस्प्लेइन: रेड्रा सभी टाइल्स।

+0

नहीं। यह समस्या नहीं है कि किस टाइल्स को फिर से निकालना होगा। समस्या यह है कि अगर एक टाइल को फिर से निकालना होगा, तो टाइल को पहले सफेद रंग में साफ़ कर दिया जाएगा और फिर नई सामग्री खींची जाएगी। हम जो चाहते हैं वह यह है कि टाइल नई सामग्री आने से पहले स्केल की गई पुरानी सामग्री दिखा सकती है लेकिन केवल सफेद नहीं। – Yeung

+0

@ क्रिस, जिसने मुझे भी मदद की है, लेकिन क्या अब आप इस तरह के व्यवहार का कारण हैं? – Azat

+1

@Azat आईओएस में बग की एक (लंबी) सूची में बस एक और मुझे आईओएस डेवलपर के रूप में सामना करना पड़ा है, दुर्भाग्य से :) – Chris

0

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

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