2009-07-15 6 views
12

आईफोन पर (हालांकि मुझे लगता है कि यह कोको में एक समान रूप से वैध प्रश्न है) मेरे पास एक CITiledLayer द्वारा समर्थित UIView के आसपास एक UIScrollView है। जिस तरह से यह डिफ़ॉल्ट रूप से काम करता है वह है किसी भी अनचाहे/अप्रत्याशित टाइल्स को लोड करना जब मेरा व्यूपोर्ट CATiledLayer के रिक्त अनुभाग पर स्क्रॉल करता है।एक CATiledLayer में प्रीलोड/predisplay टाइल्स?

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

कोई विचार?

+0

क्या आप इसे समझ गए? मैं वास्तव में जानना चाहूंगा कि आपने ऐसा कैसे किया है। –

+0

नहीं। कभी नहीं किया था। :(setNeedsDisplayInRect का उपयोग करना: पहले से लोड किए गए टाइल की सामग्री को रीफ्रेश करने के लिए काम करता है, लेकिन ऐसा लगता है कि यह प्रीलोड नहीं है। – jemmons

उत्तर

14

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

@interface NoFadeTiledLayer : CATiledLayer { 
} 
@end 

@implementation NoFadeTiledLayer 
+ (CFTimeInterval)fadeDuration { 
    return 0.0; 
} 
@end 

@implementation MyViewWithTiledLayer 
+ (Class)layerClass { 
    return [NoFadeTiledLayer class]; 
} 
... 
@end 

दूसरे, आप कर सकते हैं अपने खुद के प्री-फ़ेच और आसन्न टाइल्स की कैशिंग ताकि वे जब जाने के लिए तैयार कर रहे हैं CATileLayer ड्रॉलेयर कॉल करता है: inContext। मैं scrollViewDidScroll को लागू करता हूं: और scrollViewDidZoom: आसन्न टाइल्स और स्तर OfDetail निर्धारित करने के लिए। फिर कैश लुकअप करें और कोई भी प्री-फ़ेच/रेंडर कतार में मौजूद न जोड़ें। एक पृष्ठभूमि धागा कतार की सेवा कर सकता है और बाद के स्क्रॉल या ज़ूम कतार को साफ़ और पुनर्निर्माण करेंगे। फिर DrawLayer है: inContext पहले कैश की जांच करें और केवल आवश्यक होने पर ही/प्राप्त करें।

+1

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

0

आपको उन क्षेत्रों पर setNeedsDisplayInRect को कॉल करने का प्रयास करना चाहिए: उन क्षेत्रों पर जिन्हें आप प्रदर्शित करना चाहते हैं। यदि आप टाइल सीमाओं के भीतर रखना चाहते हैं तो आप टाइल सीमाओं की गणना करने के लिए टाइल आकार संपत्ति का उपयोग कर सकते हैं।

लेकिन मुझे यह सुनिश्चित नहीं है कि यह काम करेगा या नहीं और हम नहीं जानते कि टाइल कैशिंग तंत्र कैसे काम करता है।

4

कैटाइललेयर उन निराशाजनक वर्गों में से एक है जहां यह एक चीज महान है, लेकिन इसमें कोई लचीलापन नहीं है।

इस बिंदु पर सब है कि हमारे पास बचा है रचनात्मकता है:

1) अपने स्क्रॉल बड़ा देखने बनाओ। मैंने "रिक्त" टाइल्स को देखना बंद करने से पहले मैंने स्क्रीन के 5x आकार की कोशिश की। स्मृति उपयोग से सावधान रहें! आप एक विशाल क्षेत्र में आ रहे हैं भले ही उपयोगकर्ता केवल 2% देखता है।

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

http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html

बेशक, दो के कुछ संयोजन अगर तुम समय निवेश करना चाहते हैं काम कर सकते हैं।

+0

सभी बेहतरीन विचार। मेरी इच्छा है कि मैं दो उत्तरों का नाम दे सकता हूं! – jemmons