मुझे पता है कि ऑटो लेआउट श्रृंखला में मूल रूप से 3 अलग-अलग प्रक्रिया शामिल हैं।
- बाधाओं को अद्यतन करना
- लेआउट दृश्य (यहां हम फ्रेम की गणना प्राप्त करते हैं)
- प्रदर्शन
जो मेरे लिए पूरी तरह से स्पष्ट नहीं है, वह आंतरिक अंतर है -setNeedsLayout
और -setNeedsUpdateConstraints
। Apple डॉक्स से:
जब आप किसी दृश्य के साक्षात्कार के लेआउट को समायोजित करना चाहते हैं तो इस पद्धति को अपने आवेदन के मुख्य धागे पर कॉल करें। यह विधि अनुरोध का एक नोट बनाती है और तुरंत लौटती है। क्योंकि यह विधि तत्काल अद्यतन के लिए बाध्य नहीं करती है, बल्कि इसके बजाय अगले अद्यतन चक्र की प्रतीक्षा करती है, आप इसका उपयोग कई विचारों के लेआउट को अमान्य करने के लिए कर सकते हैं इससे पहले कि कोई भी अपडेट अपडेट हो। यह व्यवहार आपको अपने सभी लेआउट अपडेट को एक अद्यतन चक्र में समेकित करने की अनुमति देता है, जो आमतौर पर प्रदर्शन के लिए बेहतर होता है।
जब आपके कस्टम दृश्य की एक संपत्ति इस तरह से बदल जाती है जो बाधाओं को प्रभावित करती है, तो आप इस पद्धति को यह संकेत करने के लिए कह सकते हैं कि भविष्य में किसी बिंदु पर बाधाओं को अद्यतन करने की आवश्यकता है। तब सिस्टम अपने सामान्य लेआउट पास के हिस्से के रूप में अपडेटकॉन्स्ट्रेंट्स को कॉल करेगा। जरूरत पड़ने से ठीक पहले एक बार सभी बाधाओं को अद्यतन करना यह सुनिश्चित करता है कि लेआउट पास के बीच में आपके दृष्टिकोण में कई परिवर्तन किए जाने पर आपको अनावश्यक रूप से बाधाओं की आवश्यकता नहीं होती है।
जब मैं एक बाधा को संशोधित करने के बाद एक दृश्य को चेतन करना चाहता हूं और उन परिवर्तनों को चेतन करता हूं जिन्हें मैं आमतौर पर उदाहरण के लिए कहता हूं:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
मुझे पता चला है कि अगर मैं अपेक्षा -setNeedsLayout
के अनुसार -setNeedsUpdateConstraints
हर काम के बजाय उपयोग करता हूं , लेकिन अगर मैं बदल -layoutIfNeeded
जाता हूं -updateConstraintsIfNeeded
, तो एनीमेशन नहीं होगा।
मैंने अपना निष्कर्ष निकालने की कोशिश की है:
-updateConstraintsIfNeeded
केवल अपडेट की कमी है, लेकिन लेआउट को इस प्रक्रिया में आने के लिए मजबूर नहीं करता है, इस प्रकार मूल फ्रेम अभी भी संरक्षित हैं-setNeedsLayout
कॉल भी-updateContraints
विधि
तो एक के बजाय एक का उपयोग करना कब ठीक है? और लेआउट के तरीकों के बारे में, क्या मुझे उन्हें उस दृष्टिकोण पर कॉल करने की आवश्यकता है जो एक बाधा में या माता-पिता के दृष्टिकोण में परिवर्तन है?