2009-07-30 16 views
13

नहीं कहा जा रहा है मेरी वस्तु एनएसओब्जेक्ट के उप-वर्ग में कैलियर इंस्टेंस चर है। मैं इसे अपने ऑब्जेक्ट पर अपने प्रतिनिधि सेट के साथ सामग्री ड्राइंग और कैशिंग करने के लिए उपयोग करता हूं।कैलियर प्रतिनिधि विधि drawLayer को

लेकिन किसी कारण से drawLayer:inContext: विधि कभी भी कॉल नहीं किया जाता है। जबकि actionForLayer:forKey: प्रतिनिधि विधि को इंगित करने के लिए कहा जाता है कि प्रतिनिधि को ऑब्जेक्ट की init विधि में layer.delegate = self के साथ ठीक से सेट किया जा रहा है।

मेरी परत ड्राइंग विधि drawLayer:inContext: को रोकने से क्या कोई सुझाव है?

मुझे अक्सर [layer setNeedDisplay] कहा जाता है। तो मुझे लगता है कि यह कुछ मौलिक त्रुटि है।

उत्तर

22

drawLayer:inContext: कॉल नहीं किया जाएगा यदि आपका फ्रेम CGRectZero या ऑफस्क्रीन है। साथ ही, यदि आपका कैलियर किसी मौजूदा ऑनस्क्रीन परत से जुड़ा हुआ नहीं है, तो इससे कोई फर्क नहीं पड़ता कि आप कितनी बार setNeedsDisplay

+1

setNeedsDisplay – antonio081014

+1

तय टाइपो ... धन्यवाद में setNeedsDisplay कॉल करना होगा। – amattn

4

यदि आप अंततः UIView के साथ CALAYer का उपयोग कर रहे हैं तो प्रतिनिधि को दृश्य होना चाहिए खुद आपत्ति:

आईओएस CALayer प्रलेखन से:

"iOS में, यदि परत एक UIView वस्तु के साथ जुड़ा हुआ है, इस संपत्ति का मानना ​​है कि परत का मालिक करने के लिए सेट किया जाना चाहिए।"

+0

वाह, मुझे याद आया, धन्यवाद। – huggie

+3

संभावित रूप से "एक UIView ऑब्जेक्ट से जुड़ा हुआ" का अर्थ है कि परत दृश्य की रूट परत है (जिसे 'परत' प्रॉपर्टी द्वारा संदर्भित किया जाता है)। UIView की रूट परत के sublayers के लिए, प्रतिनिधि निश्चित रूप से दृश्य वस्तु से कुछ और हो सकता है। – herzbube

17

एक खाली drawRect:

- (void)drawRect:(CGRect)rect { 
} 

ZoomingPDFViewer परियोजना से लिया कार्यान्वित करें: -

UIView -drawRect: के अस्तित्व को निर्धारित करने के अगर यह अपने CALayer अवैध होने की अनुमति चाहिए, का उपयोग करता है जो इसके बाद परत का समर्थन बैकिंग स्टोर और -drawLayer:inContext: कहा जा रहा है। एक खाली -drawRect: विधि लागू करने से, हम, जबकि -drawLayer:inContext:

+0

यह मैकोज़ पर भी सच है। –

+0

ऐप्पल बता रहा है कि UIView में एक खाली drawRect विधि को लागू नहीं किया गया है क्योंकि यह प्रदर्शन को प्रभावित करता है। कॉलिंग - [setNeedsDisplay] एक बेहतर समाधान प्रतीत होता है। (मेरे लिए काम किया।) – JCalhoun

7

परत वस्तु की setNeedsDisplay बुलाया जाना चाहिए के अंदर हमारी असली ड्राइंग काम कर UIKit इस तर्क लागू करने के लिए जारी रखने के लिए अनुमति देते हैं। बस एक sublayer के रूप में परत जोड़ने के लिए यह आपके लिए नहीं करता है। रे वेंडरलिच के CALayer tutorial से यह मिला।

1

आप जहां पृष्ठभूमि प्रसंस्करण ड्राइव CALayer अद्यतन करने की आवश्यकता एक मल्टी-थ्रेडेड अनुप्रयोग है, तो आप मुख्य थ्रेड

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