मेरे पास एक UIView है जिसे कई बाधाओं के माध्यम से स्क्रीन पर रखा गया है। कुछ बाधाओं का पर्यवेक्षण पर्यवेक्षक के स्वामित्व में है, अन्य अन्य पूर्वजों के स्वामित्व में हैं (उदाहरण के लिए शायद एक यूआईवाईवीसींट्रोलर की संपत्ति देखें)।
मैं इन सभी पुरानी बाधाओं को दूर करना चाहता हूं, और नए अवरोधों का उपयोग करके इसे कहीं नए स्थान पर रखना चाहता हूं।
मैं हर एक बाधा के लिए एक IBOutlet बनाए बिना यह कैसे कर सकता हूं और यह याद रखना चाहिए कि कौन सा दृश्य स्वामित्व कहा गया है।
विस्तृत करने के लिए, भोले दृष्टिकोण प्रत्येक बाधा के लिए IBOutlets का एक गुच्छा बनाने के लिए होगा, और फिर कॉलिंग कोड जैसे:
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
इस कोड के साथ समस्या यह है कि सबसे सरल मामले में भी, मुझे 2 IBOutlets बनाने की आवश्यकता होगी। जटिल लेआउट के लिए, यह आसानी से 4 या 8 आवश्यक IBOutlets तक पहुंच सकता है। इसके अलावा, मुझे यह सुनिश्चित करने की आवश्यकता होगी कि बाधा को दूर करने के लिए मेरा फोन उचित दृष्टिकोण पर बुलाया जा रहा है। उदाहरण के लिए, कल्पना करें कि myViewsLeftConstraint
यह किसके स्वामित्व में है viewA
। अगर मैं गलती से कॉल करता [self.view removeConstraint:self.myViewsLeftConstraint]
, तो कुछ नहीं होता।
नोट: विधि constraintsAffectingLayoutForAxis होनहार लग रही है, लेकिन केवल डिबगिंग उद्देश्यों के लिए अभिप्रेत है।
अपडेट: उत्तर मैं के साथ सौदा प्राप्त कर रहा से कई self.constraints
, self.superview.constraints
, या कुछ उन लोगों में से संस्करण। ये समाधान काम नहीं करेंगे क्योंकि ये विधियाँ केवल दृश्य के स्वामित्व वाली बाधाओं को लौटाती हैं, न कि दृश्य को प्रभावित करने वाले ।
इन समाधानों के साथ समस्या को स्पष्ट करने के लिए, इस दृश्य को पदानुक्रम मानें:
- दादा
- पिता
- मुझे
- बेटा
- बेटी
- भाई
- मुझे
- चाचा
- पिता
अब कल्पना करें कि हम निम्नलिखित बाधाओं का निर्माण करते हैं, और हमेशा उन्हें अपने निकटतम सामान्य पूर्वज से जोड़ते हैं:
- C0: मी: सोन के रूप में एक ही शीर्ष (मेरे द्वारा स्वामित्व)
- C1: Me: चौड़ाई = 100 (मेरे स्वामित्व में)
- C2: मुझे: भाई के समान ऊंचाई (पिता के स्वामित्व में)
- C3: मुझे: चाचा के रूप में एक ही शीर्ष (दादाजी के स्वामित्व में)
- C4: मुझे: दादाजी के रूप में एक ही बचा है (दादाजी के स्वामित्व में)
- C5: भाई: पिता के समान छोड़ दिया गया (पिता के स्वामित्व में)
- C6: चाचा: दादाजी के रूप में एक ही छोड़ दिया (दादाजी के स्वामित्व में)
- C7: बेटा: बेटी के समान ही (मेरे द्वारा स्वामित्व में)
अब कल्पना करें कि हम प्रभावित सभी बाधाओं को दूर करना चाहते हैं Me
। कोई उचित समाधान निकालना चाहिए [C0,C1,C2,C3,C4]
और कुछ नहीं।
यदि मैं उपयोग करता हूं self.constraints
(जहां स्वयं मैं हूं), तो मुझे मिलेगा [C0,C1,C7]
, क्योंकि वे मेरे द्वारा स्वामित्व वाली एकमात्र बाधा हैं। जाहिर है कि इसे हटाने के लिए पर्याप्त नहीं होगा क्योंकि यह गायब है [C2,C3,C4]
। इसके अलावा, यह C7
अनावश्यक रूप से निकाल रहा है ।
यदि मैं उपयोग करता हूं self.superview.constraints
(जहां स्वयं मैं हूं), तो मुझे मिलेगा [C2,C5]
, क्योंकि वे पिता के स्वामित्व में बाधाएं हैं। जाहिर है कि हम इन सभी को हटा नहीं सकते क्योंकि C5
पूरी तरह से असंबंधित है Me
।
अगर मैं उपयोग करता हूं grandfather.constraints
, तो मुझे मिलेगा [C3,C4,C6]
। फिर से, हम इन सभी को हटा नहीं सकते क्योंकि C6
बरकरार रहना चाहिए।
ब्रूट फोर्स एप्रोच को व्यू के प्रत्येक पूर्वजों (स्वयं सहित) पर लूप करना है, और यह देखते हुए कि खुद ही दृश्य हैं firstItem
या नहीं secondItem
; यदि हां, तो उस बाधा को हटा दें। इससे एक सही समाधान होगा, वापसी [C0,C1,C2,C3,C4]
, और केवल उन बाधाओं को।
हालांकि, मुझे उम्मीद है कि पूर्वजों की पूरी सूची के माध्यम से लूप होने की तुलना में अधिक सुरुचिपूर्ण समाधान है।