2013-10-31 9 views
16

मेरे पास एक टेबल व्यू और इसके अंदर एक सेल है। कक्ष में तीन लेबल होते हैं: हेडर लेबल और एक से नीचे दो लेबल एक दूसरे के लिए। कभी-कभी, मुझे उन दो लेबलों को नीचे छिपाने की आवश्यकता होती है यदि उनमें डेटा नहीं है और "हेडर लेबल" के "कंटेनर के लिए शीर्ष स्थान" को "कंटेनर में केंद्र वाई" में बदलना है। और निश्चित रूप से बाधाओं को वापस लाएं जब दो लेबल में डेटा होता है। यहां केवल उपाय प्रदर्शित करने के लिए सरल डेमो परियोजना का एक स्क्रीनशॉट है:रनटाइम के दौरान लेबल बाधाओं को कैसे बदला जाए?

enter image description here

अद्यतन मैक्स मेक्लेओड जवाब सही दिशा की ओर इशारा। यह चाल है कि पहले और दूसरे लेबल छुपाए जाने पर हेडर लेबल को दबाएं। तो हमें हेडर लेबल के लिए कंटेनर व्यू पर शीर्ष स्थान बनाने के बजाय पहले और दूसरे लेबल के लिए कंटेनर व्यू पर नीचे स्थान सेट करने की आवश्यकता है। और छिपाने/छिपाने के लिए ऊंचाई आउटलेट (पहले और दूसरे लेबल के लिए ऊंचाई बाधाएं) और अपने निरंतर मान शून्य पर सेट करके (और बिना छेड़छाड़ के मूल्य को वापस सेट करके) किया जाना चाहिए। मैंने source code example to Github भी अपलोड किया।

उत्तर

32

हैडर लेबल का चयन करें, और कम लेबल में से एक, और एक नया ऊर्ध्वाधर अंतरिक्ष बाधा उन दोनों के बीच की खाई को परिलक्षित करती है जोड़ें। इसके बाद, हेडर लेबल को कंटेनर बाधा के लिए शीर्ष स्थान हटा दें। हो सकता है कि आपके पास पहले से ही यह है (स्क्रीन पकड़ने से काफी कुछ नहीं देख सकता)। यदि आप करते हैं, तो यह अच्छा है।

अब, प्रत्येक निचले लेबल के लिए दो ऊंचाई बाधाएं बनाएं। IBOutlet आपकी कक्षा में हैं।

फिर, जब भी आपको प्रत्येक ऊंचाई बाधा constant0.f पर सेट करके इन दो निचले लेबलों को छुपाएं।

जो उन्हें अदृश्य प्रदान करेगा और उपरोक्त शीर्षलेख लेबल को कम करेगा ताकि यह अब कंटेनर में लंबवत केंद्रित वाई हो।

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

वापस करने के लिए, बस constant पर मूल मान पर सेट करें।

बाधाओं को जोड़ने/हटाने से यह एक बेहतर तरीका है, जो एक हेवीवेट ऑपरेशन है। ध्यान दें कि आप दो निचले लेबल को "कंटेनर" दृश्य में जोड़ना चाहते हैं, ताकि उन्हें एक के रूप में दिखाया जा सके/छुपाया जा सके। साथ ही, यह कोड को साफ करेगा क्योंकि आप वास्तव में ऊर्ध्वाधर स्थान को अपने ऊपरी लेबल के बीच और केवल एक के बजाय कम लेबल दोनों चाहते हैं।

भी देखें मेरा उत्तर AutoLayout with hidden UIViews?

+0

आपका क्या मतलब है "हेडर लेबल को लंबवत अंतर बनाने के लिए एक नई बाधा जोड़ें"। यह किस प्रकार की बाधा होनी चाहिए? मैंने ऊर्ध्वाधर स्पेस बाधा द्वारा हेडर लेबल के साथ पहले से ही कम लेबल डाले हैं। – Centurion

+0

यदि मैं "कंटेनर के लिए शीर्ष स्थान" बाधा को हटाता हूं तो आईबी "वाई स्थिति के लिए बाधा की आवश्यकता" के साथ त्रुटियों को दिखाता है – Centurion

+0

हाँ पहले आपको इसे नई बाधा देने की आवश्यकता है, फिर अब - अतिप्रवाह - पुराना जोड़ें। आईबी अस्पष्टता की अनुमति नहीं देगा –

-3

शायद ही कभी आप समझने में आसानी कर सकते हैं और एप्पल दस्तावेज़ीकरण पर होने पर कुछ हाथों पर उदाहरण दे सकते हैं, लेकिन यह नियम में अपवाद का सही मामला है।

मुझे व्यक्तिगत रूप से यह दस्तावेज़ समझने में इतना आसान लगता है, और इतना स्पष्ट है। सबसे अच्छा तरीका समय में एक स्वत: लेआउट गुरु बनने के लिए :)

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutinCode/AutoLayoutinCode.html

मूल रूप से, क्रम का अर्थ है "प्रोग्राम के रूप में"।

तो अपने प्रश्न का उत्तर यहाँ निहित है:

https://stackoverflow.com/a/12623006/517119

+0

सेब लिंक टूटा हुआ है। कृपया इसे अद्यतन करने पर विचार करें। –

0

मैं कुछ अपने आप को कर रहा हूँ बहुत ज्यादा यह पसंद है। तो दोनों लेबलों में चौड़ाई बाधा जोड़ें। बाधा लागू होने पर आपको निरंतर मूल्य बदलने की अनुमति है - बस इसका संदर्भ रखें। मेरे मामले में मेरे पास एक सरणी है जिसमें मैंने उन बाधाओं को रखा है जिन्हें मैं बदलने की योजना बना रहा हूं।

जब आप लेबल छिपाना चाहते हैं, c मान 0 से बदलें - आप इसे एनीमेशन ब्लॉक में भी कर सकते हैं। मूल्य बदलने के लिए।

आप नीचे की जगह के बराबर शीर्ष स्थान की चौड़ाई भी बना सकते हैं, इसलिए जब दृश्य छिपाते हैं या दिखाते हैं तो आप केंद्रित वस्तुओं के "समूह" को रखते हैं।

ध्यान दें कि आप बाधाओं को भी जोड़ या हटा सकते हैं लेकिन आईओएस के साथ निपटने के लिए यह अधिक महंगा है।

5

उन लेबलों को रखें जिन्हें आप एक दृश्य में छिपाना चाहते हैं, एक बार सब कुछ सही लेआउट बाधाएं हो, कंटेनर व्यू में ऊंचाई बाधा जोड़ें, और बाधा को IBOutlet संपत्ति में कनेक्ट करें।

सुनिश्चित करें कि आपके गुण strong

कोड में

यो बस 0 के लिए निरंतर की स्थापना की और इसे सक्रिय करने, सामग्री छिपा है, या यह निष्क्रिय सामग्री दिखाने के लिए यद्यपि कर रहे हैं सुनिश्चित करें। यह स्थिर मूल्य के साथ गड़बड़ करने से बेहतर है-इसे पुनर्स्थापित करना। बाद में layoutIfNeeded पर कॉल करना न भूलें।

@property (strong, nonatomic) IBOutlet UIView *myContainer; 
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!! 

-(void) showContainer 
{ 
    self.myContainerHeight.active = NO; 
    self.myContainer.hidden = NO; 
    [self.view layoutIfNeeded]; 
} 
-(void) hideContainer 
{ 
    self.myContainerHeight.active = YES; 
    self.myContainerHeight.constant = 0.0f; 
    self.myContainer.hidden = YES; 
    [self.view layoutIfNeeded]; 
} 

एक बार जब आप अपने सेटअप आप मूल मान 0 करने के लिए अपने बाधा स्थापित करने और फिर वापस द्वारा IntefaceBuilder में यह परीक्षण कर सकते हैं। अन्य बाधाओं की प्राथमिकताओं की जांच करना न भूलें ताकि छुपाए जाने पर कोई संघर्ष न हो। इसका परीक्षण करने का दूसरा तरीका इसे 0 पर रखना है और प्राथमिकता को 0 पर सेट करना है, लेकिन, आपको इसे सर्वोच्च प्राथमिकता में दोबारा बहाल करना नहीं भूलना चाहिए।

+0

बहुत बढ़िया जवाब ... मुझे पता है कि हम बाधा के लिए आउटलेट रख सकते हैं n प्लेसहोल्डर बाधा है ..लेकिन अब पता था कि हम बाधाओं को सक्रिय कर सकते हैं –

+0

मुझे खुशी है कि आप मेरा जवाब उपयोगी पाते हैं, धन्यवाद। –

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