कैसे एक UIView प्रोग्राम की निरंतर ऊंचाई की बाधा को अद्यतन करने के लिए?


102

मेरे पास एक है UIViewऔर मैंने Xcode इंटरफ़ेस बिल्डर का उपयोग करके बाधाओं को निर्धारित किया है।

अब मुझे उस UIView'sऊंचाई को क्रमिक रूप से अद्यतन करने की आवश्यकता है ।

एक ऐसा फंक्शन है जो पसंद आता है myUIView.updateConstraints(), लेकिन मुझे नहीं पता कि इसका इस्तेमाल कैसे किया जाए।


ऊंचाई की सीमा से बाहर
निकलें

आप इस लिंक या संदर्भ के लिए इस लिंक का उपयोग कर सकते हैं ।
आमना फरहान

यहाँ एकल या एकाधिक बाधाओं को अद्यतन करने का एक तरीका है। stackoverflow.com/a/54171693/8861442
सरथ कुमार राजेन्द्रन

जवाबों:


217

इंटरफ़ेस बिल्डर से ऊंचाई की बाधा का चयन करें और इसका एक आउटलेट लें। इसलिए, जब आप दृश्य की ऊंचाई बदलना चाहते हैं तो आप नीचे दिए गए कोड का उपयोग कर सकते हैं।

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

विधि updateConstraints()का एक उदाहरण विधि है UIView। यह मददगार होता है जब आप बाधाओं को प्रोग्रामेटिक रूप से सेट कर रहे होते हैं। यह देखने के लिए बाधाओं को अद्यतन करता है। अधिक विवरण के लिए यहां क्लिक करें


58
आज मुझे पता चला कि बाधाओं को एक आउटलेट में बदल दिया जा सकता है, और वहां से मैं जो कुछ भी करना चाहता हूं वह कर सकता हूं। धन्यवाद
क्रिस मिकेलसेन

@ParthAdroja, भाई क्या आप मेरे प्रश्न stackoverflow.com/questions/46034278 पर एक नज़र डाल सकते हैं ?
मई Phyu

मेरे पास एक xib फ़ाइल नहीं है, और एक UIView प्रोग्राम में अपनेHeightConstraint कैसे सेट करें?
न्यूजजर


मैंने सुना है कि हमें निरंतर अवरोध के बाद लेआउटआईफाइड कहा जाना चाहिए। क्यों? और कभी-कभी मैं viewIfNeeded को viewWillLayoutSubviews और viewDidLayoutSubviews के अंदर कॉल करता हूं। क्या यह सही है?
mnemonic23

104

यदि आपके पास कई बाधाओं के साथ एक दृश्य है, तो कई आउटलेट बनाने के बिना बहुत आसान तरीका होगा:

इंटरफ़ेस बिल्डर में, एक पहचानकर्ता को संशोधित करने की इच्छा रखने वाले प्रत्येक बाधा दें:

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

फिर कोड में आप कई बाधाओं को संशोधित कर सकते हैं जैसे:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

आप एक ही पहचानकर्ता को एक साथ कई बाधाएँ दे सकते हैं और आपको एक साथ सभी बाधाओं को एक साथ समूह में बदलने की अनुमति दे सकते हैं।


यह अच्छी तरह से काम करता है, लेकिन मुझे बाधाओं को दूर करने के लिए सिर्फ एक नियमित आउटलेट संग्रह का उपयोग करना आसान लग रहा है। उदाहरण के लिए, जिस दृश्य पर मैं काम कर रहा हूं, उसमें 47 बाधाएं हैं, लेकिन केवल 6 जिसे मैं रनटाइम में बदलना चाहता हूं, इसलिए यह बहुत छोटा लूप है। यह भी दो अलग अलग स्थानों के बीच सिंक में तार रखने की आवश्यकता नहीं है।
गैरी जेड

1
इस टिप के लिए धन्यवाद जॉर्ज। यह कुछ मौजूदा लेआउट के साथ एक वास्तविक मदद है, जिसके साथ मैं खेल रहा हूं।
जिम हिलहाउस


नमस्ते, मैं इसे उसी तरह उपयोग कर रहा हूं, लेकिन यह कभी भी इस मामले में नहीं जाता है और मैंने समान पहचानकर्ता दिया है।
रॉब 13

मैं सोच रहा था कि क्या बाधा नाम देना संभव था। बहुत बढ़िया जवाब!
ShadeToD

35

बदलें HeightConstraintऔर WidthConstraintबिना बनाए IBOutlet

नोट: स्टोरीबोर्ड या XIB फ़ाइल में ऊंचाई या चौड़ाई की बाधा को असाइन करें। इस विस्तार का उपयोग करके इस बाधा को लाने के बाद।

आप इस एक्सटेंशन का उपयोग ऊंचाई और चौड़ाई प्राप्त करने के लिए कर सकते हैं:

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

आप उपयोग कर सकते हैं:

yourView.heightConstraint?.constant = newValue 

2
एक ऐसी विधि है first(where: ...)जिसे आप तुरंत इस्तेमाल कर सकते हैं filter+first
व्यासचावल गेरिकोकोव

13

एक IBOutlet के रूप में अपने वीसी में बाधा खींचें। फिर आप इसके संबद्ध मूल्य को बदल सकते हैं (और अन्य गुण; दस्तावेज की जांच करें):

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}

9

यदि आप चाहते हैं तो आप एक चिकनी एनीमेशन के साथ अपने बाधा को अद्यतन कर सकते हैं, नीचे दिए गए कोड का हिस्सा देखें:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

यदि उपरोक्त विधि काम नहीं करती है, तो सुनिश्चित करें कि आप इसे Dispatch.main.async {} ब्लॉक में अपडेट करें। इसके बाद आपको layoutIfNeeded () विधि को कॉल करने की आवश्यकता नहीं है।


4

नीचे दिए गए कोड की तरह IBOutlet बनाने के लिए पहले हमारे दृष्टिकोण में ऊंचाई की बाधा को कनेक्ट करें

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

फिर नीचे दिए गए कोड को लोड या किसी भी कार्रवाई के अंदर देखने के लिए रखें

self.select_dateHeight.constant = 0 // we can change the height value

अगर यह एक बटन क्लिक के अंदर है

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}

1

एक लेआउट बाधा को अद्यतन करने के लिए आपको केवल निरंतर संपत्ति को अपडेट करने और लेआउट को कॉल करने की आवश्यकता है।

myConstraint.constant = newValue
myView.layoutIfNeeded()

1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.