2015-08-26 5 views
27

मेरे पास एक साधारण (मुझे लगता है) समस्या है: मेरे पास UIImageView है, जिसे मैंने स्टोरीबोर्ड में कई बाधाएं सेट की हैं।सक्षम करें + ऑटो-लेआउट बाधाओं को अक्षम करें

कभी-कभी, मुझे बाधाओं को अक्षम करने की आवश्यकता होगी, और इसे frame मैन्युअल रूप से सेट करना होगा, लेकिन बाद में, मैं उन बाधाओं को फिर से सक्षम करना चाहता हूं और दृश्यों को वापस लौटा सकता है जहां यह बाधाओं के अनुसार तय किया गया था।

मैंने सोचा कि मैं की तरह कुछ के साथ ऐसा कर सकता है:

@IBOutlet weak var imageView: UIImageView! 
@IBOutlet weak var constraint: NSLayoutConstraint! 

func example() { 

    //to set its location and size manually 
    imageView.removeConstraint(constraint) 
    imageView.frame = CGRectMake(...) 

    //to cause it to return to its original position 
    imageView.addConstraint(constraint) 

} 
इस के साथ

, तथापि, मैं त्रुटि 2015-08-26 01:14:55.417 Constraints[18472:923024] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fbb72815f90 V:[_UILayoutGuide:0x7fbb72814c20]-(100)-[UIImageView:0x7fbb72814540]> मिलता है। क्या कोई जानता है कि यह त्रुटि क्यों होती है?

पर पर बाधाओं को जोड़कर self.view.addConstraint(...) को कॉल करके त्रुटि से छुटकारा पाता है, लेकिन फिर भी छवि दृश्य को वापस जहां नहीं होना चाहिए।

मुझे लगता है कि मुझे समस्या के बिना imageView के फ्रेम को सेट करने में सक्षम होने के बावजूद बाधाओं को हटाने और न ही निष्क्रिय करने की आवश्यकता नहीं है, जब तक कि मैं setTranslatesAutoresizingMaskIntoConstraints(true) पर कॉल नहीं करता।

मैंने पहले से ही this प्रश्न देखा है, लेकिन उत्तर अनावश्यक रूप से जटिल, शायद पुराना, और यहां तक ​​कि अनुपयोगी लगता है।

मैंने this प्रश्न भी देखा, लेकिन इसमें बाधाओं को कवर नहीं किया जा सकता है-केवल उन्हें कैसे अक्षम किया जा सकता है।

active गुण सेट करने के लिए कोशिश कर रहा है:

self.top.active = false 
self.right.active = false 
self.bottom.active = false 
self.left.active = false 

imageView.frame = CGRectMake(100, 100, 100, 100) 

यह वास्तव में सिर्फ अब दिखाई नहीं देते जा रहा है imageView का परिणाम है। (यदि मैं सभी बाधाओं को active संपत्ति को गलत पर सेट नहीं करता हूं, हालांकि imageView उचित स्थिति में चला जाता है।

वास्तविक समस्या, हालांकि, यह है कि जब मैं छवि दृश्य को वापस लौटने की कोशिश करता हूं सच करने के लिए सभी बाधाओं को 'active संपत्ति की स्थापना द्वारा, कुछ नहीं होता-imageView रहता है जहां यह था (इस मामले के रूप में imageView.frame = CGRectMake(100, 100, 100, 100) द्वारा निर्दिष्ट।

इसके अलावा, ऐसा लगता है, मेरे परीक्षण और जोकिम Bøggild के जवाब here के अनुसार, कि जब एक बाधा active संपत्ति गलत पर सेट की जाती है, तो बाधा शून्य हो जाती है, और इस प्रकार इसे फिर से सक्रिय नहीं किया जा सकता है।

एक सरणी के लिए बाधाओं को जोड़ना और सक्रिय करने/उन्हें निष्क्रिय करने:

दिलचस्प है, इस लगभग ठीक active संपत्ति करने के समान ही समस्या आ जाती। सभी बाधाओं को एक सरणी array में रखकर, NSLayoutConstraint.deactivateConstraints(array) पर कॉल करने से छवि दृश्य गायब हो जाता है। साथ ही, NSLayoutConstraint.activateConstraints(array) के साथ बाधाओं को फिर से सक्रिय करने के लिए छवि दृश्य वापस नहीं है जहां यह होना चाहिए-यह कहां रहता है।

+0

कृपया अपने समाधान के साथ अपना जवाब पोस्ट करें, इसे अपने प्रश्न में संपादित करने के बजाय –

उत्तर

53

आह!

बाधाएं शून्य हो जाती हैं (और इस प्रकार इसे पुनः सक्रिय नहीं किया जा सकता है), एक बार उनकी active संपत्ति झूठी पर सेट हो जाती है। उन्हें मजबूत संदर्भ (धन्यवाद, नामांकन को समाशोधन के लिए कालेब) उन्हें संरक्षित करता है ताकि उन्हें वांछित के रूप में सक्रिय और निष्क्रिय किया जा सके।

31

आप डॉक्स NSLayoutConstraint के लिए आप एक अनुभाग Activating and Deactivating Constraints कहा जाता है कि active property का वर्णन करता है, जो बारी में आपको बताता है कि मिल जाएगा पर नज़र डालें तो:

आप सक्रिय या इस संपत्ति को बदलने के द्वारा एक बाधा निष्क्रिय कर सकते हैं .. बाधाओं को निष्क्रिय या निष्क्रिय करना addConstraint: और हटाएं कॉन्स्ट्रेन: इस बाधा से प्रबंधित वस्तुओं के सबसे नज़दीकी आम पूर्वज हैं। AddConstraint को कॉल करने के बजाय इस प्रॉपर्टी का उपयोग करें: या हटाएं कॉन्स्ट्रेन: सीधे।

तो, एक बार आप एक strong (जैसे आप अपने आउटलेट के साथ है के रूप में) प्रश्न में बाधा के संदर्भ में मिल गया है, तो आप बस सेट कर सकते हैं यह है activefalse (या NO Obj सी में) करने के लिए संपत्ति अक्षम करने के लिए, या true (या YES) सक्षम करने के लिए।

+0

हाय कैलेब, आपके इनपुट के लिए धन्यवाद! मैंने कोशिश की, लेकिन कुछ मुद्दों में भाग गया, जिसे मैंने उपरोक्त संपादन में वर्णित किया था। – Randoms

+2

यह भी लगता है कि जब एक बाधा का 'सक्रिय' गलत पर सेट होता है, तो बाधा शून्य हो जाती है और इस प्रकार इसे पुनः सक्रिय नहीं किया जा सकता है। – Randoms

+5

आह, समझ गया। बाधाओं के लिए आउटलेट बनाना दृढ़ता से टाइप किया गया है- अब मैं उन्हें सक्रिय रूप से सक्रिय और निष्क्रिय कर सकता हूं। – Randoms

1

स्टोरीबोर्ड से व्यू कंट्रोलर तक आईबीओटलेट के रूप में संयम कनेक्ट करें और सरणी को सरणी में सभी बाधा जोड़ें।

उपयोग में नहीं होने पर उन बाधाओं को निष्क्रिय करें।

जब भी उपयोग में बाधा जोड़ें।

NSLayoutConstraint *constraint1; 
NSLayoutConstraint *constraint2; 
NSLayoutConstraint *constraint3; 
NSArray *arr = @[constraint1,constraint2,constraint3]; 
[NSLayoutConstraint deactivateConstraints:arr]; 

//After deactivate constraint array add what ever frame you want to add 

//Activate lateroN 
[NSLayoutConstraint activateConstraints:arr]; 
+0

हाय कविता असिजा, मैंने यह भी कोशिश की, ठीक है, इसका एक स्विफ्ट-प्रस्तुति, और कुछ मुद्दों में भाग गया, जिसे मैंने उपरोक्त संपादन में जोड़ा था। – Randoms

+0

- (शून्य) अपडेट कॉन्स्ट्रेंसट्सफिडेड - (शून्य) अपडेट कॉन्स्ट्रेन्ट्स - (बूल) की ज़रूरत है अद्यतनडेट्स - (शून्य) setNeedsUpdateConstraints अद्यतन सक्रिय लागू करने के बाद बाधाएं देखें और बाधाओं को निष्क्रिय करें .. – Kavita

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