दिलचस्प पोस्ट
बहुरूपता के साथ deserializing कैसे संभालना है? पल की जेएस के साथ दो बार तुलना करना Win32Exception इस आदेश को संसाधित करने के लिए पर्याप्त संग्रहण उपलब्ध नहीं है jQuery: चयनकर्ता से $ (यह) बहिष्कृत करें समानांतर पैकेज केवल उपयोग करने के मुकाबले धीमा क्यों है? क्या मैं इस मैक्रो को अधिक कुशल या तेज बना सकता हूँ? क्यों AngularJS में पदावनत की जगह है? सिस्टम को "ज़ीरो" स्थिति में लाने के लिए जरूरी कार्रवाई की न्यूनतम संख्या निर्धारित करने के लिए किस एल्गोरिथ्म का उपयोग करना है? एमएसबिल्ड के साथ वेब कैसे प्रकाशित करें? एपीआई का क्या अर्थ है? मूल एक्सेस प्रमाणीकरण के साथ जेसूप कनेक्शन Log4j2 RollingFileAppender को कैसे अनुकूलित करें? कोड से डिवाइस का आईपी पता कैसे प्राप्त करें? विंडोज बैच में सूची या एरेज़ बनाएँ कैसे एक वस्तु में जावा के लिए एक वस्तु डाली?

छुपा UIViews के साथ AutoLayout?

मुझे लगता है कि यह सामान्य तर्क है कि UILabels , अक्सर UILabels , दिखाने के लिए / छिपाने के UIViews , व्यापार तर्क के आधार पर। मेरा प्रश्न यह है कि छिपे हुए दृश्यों का जवाब देने के लिए ऑटोलायआउट का सबसे अच्छा तरीका क्या है, जैसे कि उनका फ्रेम 0x0 था। यहां 1-3 सुविधाओं की एक गतिशील सूची का एक उदाहरण है।

गतिशील विशेषताओं की सूची

अभी मुझे बटन से अंतिम लेबल तक 10px शीर्ष स्थान मिला है, जो स्पष्ट रूप से जब लेबल छिपा हुआ है तब तक स्लाइड नहीं करेगा अभी के रूप में मैं इस बाधा को एक आउटलेट बनाया और निरंतर परिवर्तन करने पर निर्भर करता हूं कि मैं कितने लेबल प्रदर्शित कर रहा हूं। यह स्पष्ट रूप से थोड़ा हैकी है क्योंकि मैं छिपे हुए फ़्रेमों पर बटन को धक्का देने के लिए नकारात्मक निरंतर मानों का उपयोग कर रहा हूं। यह भी बुरा है क्योंकि यह वास्तविक लेआउट तत्वों के लिए विवश नहीं हो रहा है, केवल अन्य तत्वों के ज्ञात हाइट्स / पैडिंग के आधार पर चुपके की स्थिर गणनाएं, और जाहिर है कि किस प्रकार के ऑटोलेयआउट के लिए बनाया गया था।

मैं स्पष्ट रूप से सिर्फ अपने गतिशील लेबल के आधार पर नई बाधाओं को बना सकता हूं, लेकिन यह कुछ श्वेत स्थान को तोड़ने की कोशिश करने के लिए बहुत अधिक सूक्ष्म-कुशलता और कई तरह की शब्दावली है क्या बेहतर दृष्टिकोण हैं? फ़्रेम आकार 0,0 में बदल रहा है और ऑटोलायॉउट की कोई बाधाओं में कोई हेरफेर करने के साथ काम करते हैं? पूरी तरह से विचार हटाना?

ईमानदारी से, हालांकि, केवल छिपे हुए दृश्य के संदर्भ से स्थिर को संशोधित करने के लिए सरल गणना के साथ कोड की एक पंक्ति की आवश्यकता होती है बाधा के साथ नई बाधाओं को पुनः बनाने के साथ constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: बहुत भारी लगता है

Solutions Collecting From Web of "छुपा UIViews के साथ AutoLayout?"

दृश्य दिखाने / छुपाने के लिए मेरी निजी प्राथमिकता उपयुक्त चौड़ाई या ऊँचाई बाधा के साथ एक आईबीओटलेट बनाना है।

मैं फिर छिपाने के लिए constant मान को 0 में बदलता हूं, या जो कुछ भी दिखाने के लिए होना चाहिए I

इस तकनीक का बड़ा फायदा यह है कि रिश्तेदार बाधाओं को बनाए रखा जाएगा। उदाहरण के लिए, मान लें कि आपके पास A ए है और बी को एक्स के क्षैतिज अंतर के साथ देखें। जब एक चौड़ाई constant को 0.f सेट किया 0.f तो बी देखने के लिए उस स्थान को भरने के लिए बाएं चले जाएंगे।

बाधाओं को जोड़ने या निकालने की कोई आवश्यकता नहीं है, जो कि एक हेवीवेट ऑपरेशन है बस बाधा की constant अद्यतन करने से चाल की जाएगी।

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

मेरे पास एक बेहतर समाधान है

यह विचार एक 0 ऊंचाई नियम को उच्च प्राथमिकता रखने के लिए है, जब हम तत्व को छिपाते हैं ताकि यह कोई स्वस्थ्य स्थान न हो।

यहां बताया गया है कि आप ऐसा कैसे करते हैं:

1. कम प्राथमिकता वाले इंटरफ़ेस बिल्डर में 0 की चौड़ाई (या ऊंचाई) सेट करें

सेटिंग चौड़ाई 0 नियम

अंतरफलक बिल्डर संघर्ष के बारे में चिल्लाना नहीं करेगा क्योंकि प्राथमिकता कम है अस्थायी रूप से 999 (प्राथमिकता को प्रोग्रामेटिक रूप से परिवर्तित करने के लिए मना किया गया है, इसलिए हम इसका उपयोग नहीं करेंगे) की प्राथमिकता निर्धारित करके ऊँचा व्यवहार का परीक्षण करें। इंटरफ़ेस बिल्डर शायद अब परस्पर विरोधी बाधाओं के बारे में चिल्लाना होगा। आप इन्हें संबंधित ऑब्जेक्ट्स पर प्राथमिकताएं 900 या तो तय कर सकते हैं।

2. एक आउटलेट जोड़ें ताकि आप कोड में चौड़ाई बाधा की प्राथमिकता को संशोधित कर सकें:

आउटलेट कनेक्शन

3. जब आप अपना तत्व छुपते हैं तो प्राथमिकता को समायोजित करें:

 cell.alertTimingView.hidden = place.closingSoon != true cell.alertTimingWidth.priority = place.closingSoon == true ? 250 : 999 

UIStackView शायद आईओएस 9+ के लिए जाने का तरीका है न केवल यह छिपे हुए दृश्य को संभालता है, यह अतिरिक्त रिक्तियां और मार्जिन भी निकाल देगा यदि सही ढंग से सेट अप किया जाए

इस स्थिति में, मैं लेखक लेबल की ऊंचाई को एक उपयुक्त आईबीओटलेट में मैप करता हूं:

 @property (retain, nonatomic) IBOutlet NSLayoutConstraint* authorLabelHeight; 

और जब मैं बाधा की ऊंचाई 0.0f में सेट करता हूँ, हम "पैडिंग" को संरक्षित करते हैं, क्योंकि प्ले बटन की ऊंचाई इसके लिए अनुमति देता है

 cell.authorLabelHeight.constant = 0; //Hide cell.authorLabelHeight.constant = 44; //Show 

यहां छवि विवरण दर्ज करें

उपवर्ग दृश्य और ओवरराइड func intrinsicContentSize() -> CGSize बस CGSizeZero वापसी अगर दृश्य छिपा हुआ है।

मैं आसानी से बाधाओं को अद्यतन करने के लिए श्रेणी का निर्माण करता हूं:

 [myView1 hideByHeight:YES]; 

यहां उत्तर दें: आटोलेयआउट छिपाएँ UIView: मौजूदा एनएसएलएआउट कंटेंट को यह अपडेट करने के लिए कैसे प्राप्त करें

यहां छवि विवरण दर्ज करें

मुझे आश्चर्य है कि UIKit द्वारा इस वांछित व्यवहार के लिए प्रदान किया गया कोई और अधिक शानदार तरीका नहीं है। ऐसा लगता है कि ऐसा करने में सक्षम होने के लिए एक बहुत ही आम बात है।

IBOutlets लिए बाधाओं को जोड़ने और अपने स्थिरांक को 0 NSLayoutConstraint yucky महसूस किया गया (और जब आपके दृश्य में NSLayoutConstraint चेतावनी उत्पन्न हुई), मैंने एक एक्सटेंशन बनाने का निर्णय लिया जो कि NSLayoutConstraint को छिपाने / दिखाना एक सरल, राज्यपूर्ण दृष्टिकोण देता है जिसमें ऑटो लेआउट बाधाएं हैं

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

संपादित करें यह उत्तर IOS 8.4 और नीचे लक्षित है। आईओएस 9 में, बस UIStackView दृष्टिकोण का उपयोग करें

मुझे अभी पता चला कि स्थान लेने के लिए एक यूआईएलबल को पाने के लिए आपको इसे छिपाना होगा और इसके पाठ को खाली स्ट्रिंग में सेट करना होगा। (आईओएस 9)

इस तथ्य को जानने / बग कुछ लोगों को उनके लेआउट को सरल बनाने में मदद कर सकता है, संभवत: मूल प्रश्न के भी, इसलिए मैंने सोचा कि मैं इसे पोस्ट करूंगा।

सबसे अच्छा अभ्यास यह है कि जब सब कुछ सही लेआउट की कमी हो, एक ऊँचाई या बाधा के साथ जोड़ते हैं, तो यह निर्भर करता है कि आस-पास के विचारों को कैसे ले जाना चाहिए और बाधा को IBOutlet संपत्ति में जोड़ना चाहिए।

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

कोड में आपको स्थिरांक 0 पर सेट करना होगा और इसे सक्रिय करना होगा, यद्यपि सामग्री को छिपाना या सामग्री को दिखाने के लिए इसे निष्क्रिय करना है। यह निरंतर मूल्य के साथ गड़बड़ करने से बेहतर है, जो कि उसे बचाने-बहाल कर रहा है। layoutIfNeeded को कॉल करने के लिए मत भूलना 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 पर सेट करना है, लेकिन आपको उसे फिर से सर्वोच्च प्राथमिकता में बहाल करना नहीं भूलना चाहिए।

मैं विभिन्न प्रकार की पेशकश करने के लिए भी अपना समाधान प्रदान करूंगा।) मुझे लगता है कि प्रत्येक वस्तु की चौड़ाई / ऊंचाई के लिए एक रिक्ति बनाने के लिए रिक्ति के लिए सिर्फ हास्यास्पद है और कोड को संक्रमित करता है, संभावित त्रुटियां और जटिलताओं की संख्या

मेरी पद्धति सभी दृश्यों को निकाल देती है (मेरे मामले में UIImageView उदाहरण), का चयन करता है जिन्हें वापस जोड़े जाने की आवश्यकता है, और एक पाश में, यह प्रत्येक को वापस जोड़ देता है और नई बाधाओं को बनाता है यह वास्तव में वास्तव में सरल है, कृपया अनुसरण करें। यह करने के लिए मेरा त्वरित और गंदे कोड है:

 // remove all views [self.twitterImageView removeFromSuperview]; [self.localQuestionImageView removeFromSuperview]; // self.recipients always has to be present NSMutableArray *items; items = [@[self.recipients] mutableCopy]; // optionally add the twitter image if (self.question.sharedOnTwitter.boolValue) { [items addObject:self.twitterImageView]; } // optionally add the location image if (self.question.isLocal) { [items addObject:self.localQuestionImageView]; } UIView *previousItem; UIView *currentItem; previousItem = items[0]; [self.contentView addSubview:previousItem]; // now loop through, add the items and the constraints for (int i = 1; i < items.count; i++) { previousItem = items[i - 1]; currentItem = items[i]; [self.contentView addSubview:currentItem]; [currentItem mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(previousItem.mas_centerY); make.right.equalTo(previousItem.mas_left).offset(-5); }]; } // here I just connect the left-most UILabel to the last UIView in the list, whichever that was previousItem = items.lastObject; [self.userName mas_remakeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(previousItem.mas_left); make.leading.equalTo(self.text.mas_leading); make.centerY.equalTo(self.attachmentIndicator.mas_centerY);; }]; 

मुझे साफ, सुसंगत लेआउट और रिक्ति मिलती है मेरा कोड चिनाई का उपयोग करता है, मैं इसे दृढ़ता से अनुशंसा करता हूं: https://github.com/SnapKit/Masonry

मेरी पसंदीदा विधि जॉर्ज अरिमनी द्वारा सुझाए गए के समान है

मैं कई बाधाओं को बनाना पसंद करता हूं पहले जब आपके दूसरे लेबल दिखाई देते हैं तो अपनी बाधाएं बनाएं बटन और दूसरे लेबल के बीच की बाधा के लिए एक आउटलेट बनाएँ (यदि आप ओबजेसी का उपयोग कर रहे हैं तो सुनिश्चित करें कि इसकी मजबूत)। यह बाधा बटन और दूसरे लेबल के बीच की ऊंचाई को निर्धारित करता है जब यह दृश्यमान हो।

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

अंत में जब आप दूसरा लेबल .isActive हैं, तो इन बाधाओं के .isActive संपत्ति को टॉगल करें और setNeedsDisplay() कॉल करें setNeedsDisplay()

और यही है, कोई जादू संख्या नहीं, कोई गणित नहीं है, अगर आपके पास कई बाधाएं चालू होती हैं और आप उन्हें राज्य द्वारा व्यवस्थित रखने के लिए आउटलेट संग्रह का उपयोग भी कर सकते हैं। (उर्फ एक आउटलेटक्लुशन में सभी छिपी हुई बाधाएं और एक दूसरे में गैर छिपे हुए हैं और केवल प्रत्येक संग्रह पर पुनरावृति करना .isActive स्थिति)।

मुझे पता है कि रयान रोमान्चुक ने कहा कि वह कई बाधाओं का उपयोग नहीं करना चाहता था, लेकिन मुझे लगता है कि यह सूक्ष्म-योग नहीं है, और यह आसान है कि गतिशील रूप से विचारों और बाधाओं को प्रोग्राम बनाकर (जो कि मुझे लगता है कि वह इससे बचने की इच्छा रखता है अगर मैं प्रश्न सही पढ़ रहा हूँ)।

मैंने एक सरल उदाहरण बनाया है, मुझे आशा है कि यह उपयोगी है …

 import UIKit class ViewController: UIViewController { @IBOutlet var ToBeHiddenLabel: UILabel! @IBOutlet var hiddenConstraint: NSLayoutConstraint! @IBOutlet var notHiddenConstraint: NSLayoutConstraint! @IBAction func HideMiddleButton(_ sender: Any) { ToBeHiddenLabel.isHidden = !ToBeHiddenLabel.isHidden notHiddenConstraint.isActive = !notHiddenConstraint.isActive hiddenConstraint.isActive = !hiddenConstraint.isActive self.view.setNeedsDisplay() } } 

यहां छवि विवरण दर्ज करें