मैं हाल ही में ऑटो लेआउट त्रुटियों के साथ कुश्ती जब एक छिपा UIStackView। अंदर किताबों के ढेर रखने और ढेर UIViewsलगाने के बजाय , मैंने parentStackViewउन बच्चों के लिए अपने और आउटलेट के लिए एक आउटलेट बनाने का विकल्प चुना, जिन्हें मैं छिपाना / अनसुना करना चाहता हूं।
@IBOutlet weak var parentStackView: UIStackView!
@IBOutlet var stackViewNumber1: UIStackView!
@IBOutlet var stackViewNumber2: UIStackView!
स्टोरीबोर्ड में, यहाँ मेरा पेरेंटस्टैक कैसा दिखता है:

इसमें 4 बच्चे हैं और प्रत्येक बच्चे के अंदर ढेर सारे विचारों का एक समूह है। जब आप स्टैक दृश्य को छिपाते हैं, अगर इसमें यूआई तत्व मिले हैं जो स्टैक व्यू भी हैं, तो आपको ऑटो लेआउट त्रुटियों की एक धारा दिखाई देगी। छिपाने के बजाय, मैंने उन्हें हटाने का विकल्प चुना।
मेरे उदाहरण में, parentStackViews4 तत्वों की एक सरणी है: शीर्ष स्टैक व्यू, स्टैक व्यूएनम्बर 1, स्टैक व्यू नंबर 2 और स्टॉप बटन। उनके सूचकांक arrangedSubviewsक्रमशः 0, 1, 2 और 3 हैं। जब मैं एक को छिपाना चाहता हूं, तो मैं इसे parentStackView's arrangedSubviewsसरणी से हटा देता हूं । चूंकि यह कमजोर नहीं है, यह स्मृति में लिंटर करता है और आप इसे बाद में अपने इच्छित सूचकांक में वापस रख सकते हैं। मैं इसे पुन: स्थापित नहीं कर रहा हूं, इसलिए यह केवल तब तक लटका रहता है जब तक कि यह आवश्यक न हो, लेकिन स्मृति को फूला नहीं समाता।
तो मूल रूप से, आप कर सकते हैं ...
1) अपने माता-पिता के ढेर और उन बच्चों के लिए IBOutlets खींचें जो आप स्टोरीबोर्ड में छिपाना / अनसाइड करना चाहते हैं।
2) जब आप उन्हें छिपाना चाहते हैं, तो उस स्टैक को हटा दें जिसे आप parentStackView's arrangedSubviewsऐरे से छुपाना चाहते हैं ।
3) self.view.layoutIfNeeded()साथ बुलाओ UIView.animateWithDuration।
ध्यान दें कि पिछले दो स्टैक व्यू नहीं हैं weak। जब आप उन्हें अनसुना करते हैं, तो आपको उन्हें इधर-उधर रखने की जरूरत है।
मान लीजिए कि मैं stackViewNumber2 छिपाना चाहता हूं:
parentStackView.removeArrangedSubview(stackViewNumber2)
stackViewNumber2.removeFromSuperview()
फिर इसे चेतन करें:
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
यदि आप stackViewNumber2बाद में "अनहाइड" करना चाहते हैं , तो आप इसे वांछित parentStackView arrangedSubViewsइंडेक्स में सम्मिलित कर सकते हैं और अपडेट को एनिमेट कर सकते हैं।
parentStackView.removeArrangedSubview(stackViewNumber1)
stackViewNumber1.removeFromSuperview()
parentStackView.insertArrangedSubview(stackViewNumber2, at: 1)
// Then animate it
UIView.animate(withDuration: 0.25,
delay: 0,
usingSpringWithDamping: 2.0,
initialSpringVelocity: 10.0,
options: [.curveEaseOut],
animations: {
self.view.layoutIfNeeded()
},
completion: nil)
मैंने पाया कि बाधाओं पर बहीखाता करना, प्राथमिकताओं के साथ काम करना, इत्यादि से बहुत आसान होना।
यदि आपके पास कुछ ऐसा है जिसे आप डिफ़ॉल्ट रूप से छिपाना चाहते हैं, तो आप इसे स्टोरीबोर्ड पर रख सकते हैं और इसे हटा सकते हैं viewDidLoadऔर एनीमेशन का उपयोग किए बिना अपडेट कर सकते हैं view.layoutIfNeeded()।