2012-05-30 10 views
59

एक आईफोन/आईपैड ऐप बनाते समय, मैं उलझन में हूं जब मुझे सेटनेड्स डिस्प्ले को कॉल करने की ज़रूरत है? मुझे पता है कि यूआई को अपडेट/रीड्रॉइंग करने के साथ इसका कुछ संबंध है; हालांकि, क्या हर बार जब मैं अपने किसी भी विचार को बदलता हूं तो मुझे इसे कॉल करने की ज़रूरत है? प्रोग्राम के एक पाठ क्षेत्र मुझे आईओएस में setNeedsDisplay को कॉल करने की आवश्यकता कब होगी?

  • में पाठ बदलने जब एक दृश्य की पृष्ठभूमि बदलने के बाद

    • :

      उदाहरण के लिए, मैं इसे कहते हैं की जरूरत है?

    • जब मैं viewDidLoad में परिवर्तन करता हूं?
    • डीडएपियर के बारे में कैसे देखें?

    क्या कोई मुझे इस विधि का उपयोग करने के बारे में कुछ सामान्य दिशानिर्देश दे सकता है? धन्यवाद

  • उत्तर

    122

    आपको केवल सेटडिड्स डिस्प्ले को कॉल करना चाहिए यदि आप UIView के उप-वर्ग में drawRect को ओवरराइड करते हैं जो मूल रूप से एक कस्टम दृश्य स्क्रीन पर कुछ चित्रकारी करता है, जैसे रेखाएं, छवियां, या आयताकार जैसे आकार।

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

    जब आप एक छवि दृश्य या UIButton को सबव्यू के रूप में जोड़ते हैं या किसी सबव्यू में परिवर्तन करते हैं, तो आपको इस विधि को कॉल करने की आवश्यकता नहीं है।

    उदाहरण:

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

    अब इस मामले में या तो आप इन चर (केंद्र या त्रिज्या) को लूप और टाइमर में संशोधित करेंगे या स्पर्श में आपकी उंगलियों से हो सकते हैं एंडेड और स्पर्श किए गए तरीके। इस संपत्ति में परिवर्तन को दर्शाने के लिए आपको इस दृश्य को फिर से निकालना होगा जिसके लिए आप setNeedsDisplay को कॉल करेंगे।

    +0

    एक ही परत के फ्रेम को बदलने या मेरे दृश्य उपclass के अंदर देखने के बाद ही? –

    9

    आपको केवल U12iew सबक्लास पर -setNeedsDisplay पर कॉल करने की आवश्यकता है जो -drawRect: के साथ अपनी सामग्री खींचती है।

    लेबल और अन्य मानक नियंत्रणों के लिए, पाठ को बदलना स्वचालित रूप से लेबल को फिर से निकालने का कारण बनता है, इसलिए आपको इसे स्वयं करने की आवश्यकता नहीं है।

    5

    setNeedsDisplay: को तब कहा जाना चाहिए जब आप अपने दृश्य को ताज़ा करना चाहते हैं। यह सिर्फ एक आंतरिक ध्वज सेट करता है, और आईओएस यूआई सिस्टम बाद में उचित समय पर drawRect: पर कॉल करेगा।

    ऐसा लगता है कि जब आप प्रस्तुति को बदल सकते हैं तो कोई भी संपत्ति अपडेट करते समय इसे हमेशा कॉल किया जाना चाहिए। लेकिन ऐसा नहीं है। लगभग सभी मानक यूआई नियंत्रण पहले से ही इसे संभाला है। मेरा मानना ​​है कि जब भी आप मानक यूआई घटकों (विचार) के गुणों को संशोधित करते हैं, setNeedsDisplay: आंतरिक रूप से ट्रिगर किया जाएगा, और प्रभावित क्षेत्र को फिर से खींचा जाएगा।(सभी स्थितियों में आप सूचीबद्ध)

    हालांकि, अगर आप, अपने खुद के दृश्य बनाने के लिए अपने स्वयं के drawRect: लागू है, और अद्यतन करने के लिए कि जब कुछ बदल दिया गया है, आप स्पष्ट रूप से setNeedsDisplay: कॉल करना होगा चाहते हैं।

    1

    मुझे लगता है कि @ अमोग तलपल्लीकर इसे स्पष्ट करते हैं। और मैं सिर्फ एक चीज पर चर्चा करना चाहता हूं।

    इस तथ्य में, आपको drawRect ओवरराइड से बचना चाहिए जबतक कि आपको वास्तव में इसकी आवश्यकता न हो क्योंकि इससे खराब प्रदर्शन हो सकता है। आप उल्लेख कर सकते हैं इस https://yalantis.com/blog/mastering-uikit-performance/

    यदि आप केवल चाहते परिवर्तन फ्रेम, बटन, लेबल की स्थिति, ... आप कॉल कर सकते हैं setNeedLayout या layoutIfNeeded

    1

    आप setNeedDisplay जब आप संपत्ति बदल रहे हैं फोन करेगा जो आपके विचार कस्टम पर ड्राइंग निर्भर करता है। यह स्पष्ट रूप से drawRect को कॉल करेगा: विधि बलपूर्वक।

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