2012-07-14 14 views
5

के रूप में सबव्यू में drawRect को ट्रिगर नहीं करता है, मैं setNeedsDisplay के साथ संघर्ष कर रहा हूं। मैंने सोचा था कि इसे drawRect: के कॉल को ट्रिगर करना था जिसके लिए इसे बुलाया गया था और यदि नीचे की सीमा के भीतर है तो नीचे पदानुक्रम, लेकिन मुझे यह मामला नहीं मिल रहा है। यहां मेरा सेटअप है:setNeedsDisplay अपेक्षित

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

TrollCalendarView के 7 subviews PlatformView नामक एक 7 तरफा व्यवस्था में 2 डी ड्रा वस्तुओं TrollCalendarView के केंद्र के आसपास की व्यवस्था समाहित करने का कर रहे हैं। तो जब आईपैड घुमाया जाता है, तो ये 7 विचार इस तरह घूमते हैं कि वे हमेशा कार्डिनल दिशानिर्देशों के साथ उन्मुख होते हैं।

PlatformView सबव्यू में से प्रत्येक में Tower नामक 3 सबव्यूव शामिल हैं। प्रत्येक टावर में 0 डी 3 9 ड्रॉ ऑब्जेक्ट्स drawRect: में लागू होते हैं।

तो, सारांश में, मैं TrollCalendarView खाली drawRect: साथ है, और PlatformView और Platformview subviews -> टॉवर प्रत्येक drawRect कार्यान्वयन है। इसके अतिरिक्त, टॉवर प्लेटफ़ॉर्म की सीमाओं के भीतर स्थित है, और प्लेटफ़ॉर्म TrollCalendarView की सीमाओं के भीतर स्थित है।

TrollCalendarView में मैंने एक स्वाइप पहचानकर्ता जोड़ा है। जब मैं स्वाइप होता हूं, तो एक संपत्ति अपडेट की जाती है, और मैं [self setNeedsDisplay] पर कॉल करता हूं लेकिन ऐसा कुछ नहीं होता है। मैंने इन विचारों में से प्रत्येक में drawRect: विधि में NSLog प्रविष्टियों को जोड़ा, और केवल TrollCalendarViewdrawRect: विधि कहा जाता है। विडंबना यह है कि यह एक दृश्य है जिसका drawRect विधि खाली हो जाएगी।

कोई xib फ़ाइल नहीं है।

अन्य सबव्यूव में drawRect विधि को सुनिश्चित करने के लिए मुझे क्या करने की आवश्यकता है? क्या वहां कहीं दस्तावेज है जो उन सभी बारीकियों का वर्णन करता है जो इसे प्रभावित कर सकते हैं?

उत्तर

7

मैं setNeedsDisplay के साथ संघर्ष कर रहा हूं। मैंने सोचा था कि इसे उस दृश्य के लिए drawRect की कॉल ट्रिगर करना था जिसके लिए इसे कहा जाता है और उसके नीचे पदानुक्रम

नहीं, ऐसा नहीं है। आपको यह विचार कहाँ से मिला?

-setNeedsDisplay: केवल उस दृश्य पर लागू होता है जिस पर इसे भेजा जाता है। यदि आपको अन्य विचारों को अमान्य करने की आवश्यकता है, तो आपको भी -setNeedsDisplay: भेजने के लिए कुछ कोड जोड़ना होगा। यही सब है इसके लिए।

+0

मुझे यह विचार स्टैक ओवरफ्लो पर समान प्रश्नों के उत्तर से मिला है। नमूनों के लिए बस सबव्यू सेट NeedsDisplay खोजें। वहाँ कई हैं। –

+0

जब तक मैं किसी अन्य तरीके से नहीं सीखता तब तक मैं इस सुझाव का पालन करूंगा। यह कम से कम परीक्षण में मेरे निष्कर्षों से मेल खाता है। –

+1

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

5

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

क्या आप जानते हैं हैं कि आपके subviews के सभी फिर से ताज़ा किया जाना चाहिए (और नहीं बस में ले जाया गया), तो आपका मुख्य ध्यान में रखते हुए setNeedsDisplay ओवरराइड और कर इस तरह:

-(void) setNeedsDisplay { 
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)]; 
    [super setNeedsDisplay]; 
} 

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

+0

धन्यवाद। मैं कोशिश करूँगा। मेरे परिदृश्य में, 7 प्लेटफार्म सबव्यूव को फिर से खींचा जाने की आवश्यकता नहीं होगी। शेष 21 सबव्यू में से दो तिहाई को फिर से तैयार करने की आवश्यकता होगी। यह जानने के लिए कि 21 में से किस को फिर से खींचा जाना है, को drawRect में कुशलतापूर्वक गणना की जाती है और कहीं और अधिक कुशलतापूर्वक नहीं की जा सकती है। बस जिज्ञासा - ढांचा मेरे निर्णय (आपकी अनुकूलन टिप्पणी) कैसे veto करता है? ऐसा लगता है कि सेटनेड्स डिस्प्ले को पहले स्थान पर रखने के उद्देश्य को हरा देता है। –

+0

नहीं। काम नहीं करता यह केवल उप-दृश्य प्राप्त करता है। मुझे उन सबव्यूव्स के सबव्यूव को फिर से खींचा जाना चाहिए। मैंने उस बिंदु पर पेड़ को चलाने का काम करने का फैसला किया है जहां मुझे setNeedsDisplay सेट करने की आवश्यकता है। फिर भी सुझाव के लिए धन्यवाद। –

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