2016-04-08 7 views
10

देखने के लिए बाध्यकारी बाधाओं को प्रोग्रामेटिक रूप से बनाते हुए मैं एक ऐसा दृश्य बनाने की कोशिश कर रहा हूं जो दृश्य नियंत्रक के दाहिने तरफ से जुड़ा हुआ "पैनल" जैसा कार्य करेगा।नियंत्रक मार्जिन

है यही कारण है, यह पीछे, ऊपर के लिए बाध्य है, और माता पिता के दृश्य नियंत्रक के नीचे मार्जिन, 300

हालांकि की एक स्थिर चौड़ाई के साथ, मैं सिर्फ यह सही, मैं प्राप्त नहीं कर पा रहे एम या तो एक बाधा तोड़ रहा है या कुछ एक्सकोड कर रहा है मुझे बताता है कि अवैध है।

मैं क्या गलत कर रहा हूं?

यहाँ नियंत्रक

let myView = UIView() 
    view.backgroundColor = UIColor.redColor() 
    self.view.addSubview(view) 
    let topConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Top, 
              relatedBy: .Equal, 
              toItem: self.topLayoutGuide, 
              attribute: .Bottom, 
              multiplier: 1, 
              constant: 0) 

    let trailingConstraint = NSLayoutConstraint(item: self.view, 
               attribute: .TrailingMargin, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Trailing, 
               multiplier: 1, 
               constant: 0) 

    let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide, 
               attribute: .Top, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Bottom, 
               multiplier: 1, 
               constant: 0) 

    let widthConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Width, 
              relatedBy: .Equal, 
              toItem: nil, 
              attribute: .NotAnAttribute, 
              multiplier: 1, 
              constant: 300) 

    self.view.addConstraints([trailingConstraint]) 
    view.addConstraints([topConstraint, bottomConstraint, widthConstraint]) 
+1

आप इसके लिए विजुअल प्रारूप भाषा का उपयोग क्यों नहीं करते? '" एच: [पैनल (300)] | 'और '" वी: | [toplayout] [पैनल] [botlayout] | "' पर्याप्त होना चाहिए। – Eendje

उत्तर

38

वास्तव में अपने कोड में समस्या यह है कि आप d आईडी myview से false पर सेट न करें, जब भी आप ऑटो-लेआउट बाधाओं का उपयोग करना चाहते हैं तो आपको झूठी दृश्य के translatesAutoresizingMaskIntoConstraints सेट करना होगा। एक और समस्या यह है कि आप self.view पर myview नहीं जोड़ते हैं मैंने आपकी बाधाओं के अनुसार अपना कोड अपडेट किया है और यह ठीक काम कर रहा है।

अपने व्यू कंट्रोलर में कोड नीचे रखें।

let myView = UIView() 
myView.backgroundColor = UIColor.redColor() 
self.view.addSubview(myView) 
myView.translatesAutoresizingMaskIntoConstraints = false 

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Bottom, relatedBy: .Equal, toItem: self.bottomLayoutGuide, attribute:.Top, multiplier: 1, constant: 20)) 

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute,multiplier: 1, constant: 300)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .TrailingMargin, relatedBy: .Equal, toItem: view, attribute: .TrailingMargin, multiplier: 1, constant: 0)) 
+1

यदि आप प्रोग्राम्सेटिक रूप से बाधाओं को जोड़ने का अधिक आसान तरीका चाहते हैं तो आप https का उपयोग करेंगे : //github.com/keshavvishwkarma/KVConstraintExtensionsMaster। –

+0

यदि आपको वास्तव में मेरा जवाब पसंद है तो आप भी वोट देंगे। –

0

में कोड वहाँ अपने कोड में कुछ अस्पष्टता हो रहा है है, तो आप MyView के रूप में एक UIView बनाने लेकिन self.view करने के लिए दृश्य जोड़ने और यहां तक ​​कि बाधा भी खुद को देखने के लिए कर रहे हैं। तो अपना कोड सही करें और मेरे व्यू के साथ दृश्य को प्रतिस्थापित करें। दूसरा सेटट्रांसलेसऑटोरोज़ाइजिंग मास्कइंटो कॉन्स्ट्रेनेंट्स को झूठी। फिर सभी बाधाओं को self.view में जोड़ें। इससे आपकी समस्या का समाधान हो जाना चाहिए।

myView.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.view.addConstraints([trailingConstraint, bottomConstraint, widthConstraint]) 

वीएफएल भी एक बेहतर और साफ दृष्टिकोण है। यह वास्तव में एक दृश्यता देता है कि बाधा कैसे स्थापित की जाती है।

5

उपरोक्त आपके उदाहरण कोड में, ऐसा लगता है कि आप कुछ स्थानों पर view और myView मिश्रण कर रहे हैं। किसी भी घटना में, widthConstraintmyView और topConstraint, trailingConstraint, और bottomConstraint में self.view में जोड़ा जाना चाहिए। इसका कारण यह है कि बाधाओं को निकटतम पर्यवेक्षक पूर्वजों में जोड़ा जाना चाहिए जो बाधा में शामिल दोनों विचारों को बताता है। इस मामले में जहां आप अपने मूल दृश्य पर एक विशेषता के लिए एक बच्चे के दृश्य विशेषता को बाधित कर रहे हैं, बाधा को मूल दृश्य में जोड़ा जाना चाहिए, क्योंकि यह दोनों स्वयं और बच्चे के दृश्य को बताता है। यदि आपके पास दो भाई विचारों के बीच बाधा है, तो बाधा उनके मूल दृश्य में जोड़ दी जाएगी, क्योंकि यह निकटतम पूर्वज है जो दोनों विचारों को शामिल करता है।

यदि आप आईओएस 9.0 और उसके बाद के संस्करण को लक्षित करने में सक्षम हैं, तो इस तरह की बाधाओं को बनाने के लिए नए NSLayoutAnchor और NSLayoutDimension API का उपयोग करना बहुत साफ और आसान है। यह सख्त प्रकार की जांच भी प्रदान करता है और संकलक शुद्धता को सत्यापित कर सकता है। इन नए API के साथ, अपने उदाहरण कोड बस बन जाएगा:

let myView = UIView() 
myView.backgroundColor = UIColor.redColor() 
self.view.addSubview(myView) 

let margins = self.view.layoutMarginsGuide 
myView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 
myView.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true 
myView.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true 
myView.widthAnchor.constraintEqualToConstant(300.0).active = true 

स्पष्ट रूप से सही देखने के लिए, आदि के लिए बाधाओं को जोड़ने के लिए आप यहां की कमी पैदा करने की इस विधि के बारे में और अधिक पढ़ सकते हैं कोई ज़रूरत नहीं:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/

और यहाँ:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/

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