2012-03-21 18 views
7

को फिर से खींचा जा सकता है I विधि में अपना स्वयं का चित्र प्रदान करने के लिए कैलियर को उप-वर्गीकृत कर रहा हूं। अनुकूलन के लिए मैं -[MyLayer setNeedsDisplay] के बजाय -[MyLayer setNeedsDisplayInRect:] पर कॉल करता हूं। ड्राइंग विधि में मुझे आयत मिलती है जिसे CGContextGetClipBoundingBox() के माध्यम से फिर से खींचा जाना चाहिए।- [CALayer setNeedsDisplayInRect:] पूरे परत को

यदि मैं इस परत को आधार परत के रूप में उपयोग करता हूं तो प्रत्येक चीज़ अपेक्षा के अनुसार काम करती है। समस्या उत्पन्न होती है, जैसे ही मैं अपनी कस्टम परत का उपयोग किसी अन्य कैलियर के उपन्यास के रूप में करता हूं। CGContextGetClipBoundingBox() से हमेशा उस परत की सीमाओं के आयत को वापस कर देता है।

कोई विचार?

[संपादित करें]

ऐसा लगता है, कोई गारंटी नहीं है कि, कि CALayer की सामग्री कैश किया गया है और केवल गंदा हिस्सा फिर से ताज़ा हो जाता है। मैंने एक छोटा परीक्षण किया और उस आय को संग्रहित किया जिसे एक अलग संपत्ति के रूप में प्रदर्शित करने की आवश्यकता है। नतीजा यह था कि स्क्रीन पर केवल यह हिस्सा दिखाई दे रहा था।

अब मैं एक छवि संदर्भ प्रस्तुत करूँगा और उस छवि को कैश के रूप में रखूंगा। ड्रॉ विधि में मैं केवल कैश की गई छवि प्रदर्शित करूंगा।

+0

क्या गैर-दृश्य परतों में उनके 'मास्क टॉबाउंड्स' संपत्ति को 'YES' पर सेट किया गया है? यदि नहीं, तो एक अच्छा कारण है कि वे क्लिप क्यों नहीं करेंगे। – MrMage

+0

दुर्भाग्यवश यह हल नहीं करता है। समस्या यह है कि, 'CGContextGetClipBoundingBox() 'परत की सीमाएं लौटाता है, न कि क्षेत्र जिसे ऐप्पल द्वारा दस्तावेज के रूप में अपडेट किया जाना चाहिए: * उप-वर्ग जो वास्तविक क्षेत्र को आकर्षित करने के लिए खोजना चाहते हैं, CGContextGetClipBoundingBox को कॉल कर सकते हैं। * [DrawIncontext:] (https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/drawInContext :) –

+0

क्या आप कभी भी गए थे इस के नीचे? मुझे एक ही परेशान मुद्दा है। – mprivat

उत्तर

6

ऐप्पल का प्रलेखन दुर्भाग्य से विवादित है क्योंकि -setNeedsDisplayInRect पर दस्तावेज़ यह इंगित नहीं करते हैं कि विधि अभ्यास में काम करती है या नहीं। मेरे अपने अनुभव के आधार पर this technote सेट यह सीधे:

ध्यान दें कि, क्योंकि जिस तरह से iPhone/iPod टच/iPad के अपने स्क्रीन अद्यतन करता है कि, पूरे दृश्य फिर से ताज़ा हो जाएगा अगर आप -setNeedsDisplayInRect फोन की: या -setNeedsDisplay :।

कहा जा रहा है कि अगर आप सोचते हैं कि आप अनावश्यक ड्राइंग के कारण दीवार पर टक्कर मार रहे हैं तो ऐसी कई चीजें हैं जिन्हें आप देख सकते हैं।

  • छवियों को चित्रित करते समय, आप जो भी सबसे बड़ा प्रदर्शन सुधार कर सकते हैं, वह उसी आयाम की छवियों का उपयोग करना है जिस पर आप आकर्षित करते हैं। यदि वे नहीं हैं, तो इसे अपनी छवि को कुछ ऑफस्क्रीन बिटमैप संदर्भ में प्रस्तुत करके कैश करने का प्रयास करें और इसे बाद में वापस लाएं।
  • कैलियर पर shouldRasterize संपत्ति देखें। यह एक देवता हो सकता है यदि आप एक परत में हेरफेर करने की कोशिश कर रहे हैं जिसका sublayers संभावित रूप से एक जटिल परत पदानुक्रम का गठन। कोर एनीमेशन उपकरण में Color Hits Green and Misses Red बॉक्स को टिक कर आप यह जांचना सुनिश्चित करें कि आप इंस्ट्रूमेंट्स में कैसे कर रहे हैं। यदि आप बहुत सारे लाल देखते हैं, तो shouldRasterize का उपयोग कर रहे हैं इसकी सहायता से अधिक चोट लग रही है।
  • shouldRasterize से भी बेहतर है अपनी परत पदानुक्रम को फ़्लैट करना है, तब आप अतिरिक्त ऊपरी भाग से बच सकते हैं कि shouldRasterize आपकी परत पदानुक्रम वास्तविक समय को फ़्लैटन करते समय घुमाता है। बेशक यह हमेशा संभव नहीं होता है, लेकिन कोशिश करने से डरो मत :)
  • यदि आप छवियां चित्रित कर रहे हैं, तो अपने blending mode के साथ प्रयोग करने का प्रयास करें। यदि आप अपारदर्शी छवियों को चित्रित करते हैं, तो विधियों पर सामान्य स्रोत का उपयोग करने की आवश्यकता नहीं है (जो पढ़ने/लिखने दोनों बैंडविड्थ का उपयोग करते हैं)। KCGBlendModeCopy आज़माएं, जो आपको पढ़ने बैंडविड्थ ओवरहेड को खत्म करने की अनुमति देता है।
  • CGLayerRef देखें, जो आपको अपने ड्राइंग विधियों पर विभिन्न कॉलों में कोर ग्राफिक्स आउटपुट कैश करने की अनुमति देता है। मेरा अनुभव यह है कि, जब तक कि आप कुछ कट्टर पिक्सेल धक्का नहीं दे रहे हैं, कि यह केवल फिर से निकालने की तुलना में अधिक महंगा हो रहा है। एक दिलचस्प पढ़ने के लिए this देखें।
  • सबसे ऊपर, उपकरण आपका मित्र है।पिछले डब्ल्यूडब्ल्यूडीसी (2012, 2011, and 2010) से कुछ वीडियो देखें; उनके पास प्रदर्शन को सुदृढ़ करने के तरीके के बारे में बहुत अच्छी जानकारी है।

अगर कुछ मैंने कहा है तो थोड़ा और समझने के लिए स्वतंत्र महसूस करें।

+0

क्या कोई अन्य तरीका है कि कम से कम कैलियर को अपने रेड्रा/रास्टरराइजेशन को पेंड करने के लिए मजबूर किया जाए, जब तक कि अन्य UIViews उन्हें पूर्व-खाली करने के बजाय अस्पष्ट न करें? – Confused