स्विफ्ट 3 / स्विफ्ट 4 के लिए अपडेट:
IOS 8 के रूप में, आप अपनी isActive
संपत्ति को निर्धारित करके अपनी बाधाओं को सक्रिय कर सकते हैं और करना चाहिए true
। यह बाधाओं को खुद को उचित विचारों से जोड़ने में सक्षम बनाता है। आप एक से अधिक बाधाओं को पास करके एक साथ कई बाधाओं को सक्रिय कर सकते हैंNSLayoutConstraint.activate()
let label = UILabel(frame: CGRect.zero)
label.text = "Nothing to show"
label.textAlignment = .center
label.backgroundColor = .red
label.translatesAutoresizingMaskIntoConstraints = false
self.tableView.addSubview(label)
let widthConstraint = NSLayoutConstraint(item: label, attribute: .width, relatedBy: .equal,
toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 250)
let heightConstraint = NSLayoutConstraint(item: label, attribute: .height, relatedBy: .equal,
toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 100)
let xConstraint = NSLayoutConstraint(item: label, attribute: .centerX, relatedBy: .equal, toItem: self.tableView, attribute: .centerX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .centerY, relatedBy: .equal, toItem: self.tableView, attribute: .centerY, multiplier: 1, constant: 0)
NSLayoutConstraint.activate([widthConstraint, heightConstraint, xConstraint, yConstraint])
बेहतर समाधान:
चूंकि यह सवाल मूल रूप से उत्तर दिया गया था, इसलिए लेआउट एंकर को बाधाओं को बनाने में बहुत आसान बना दिया गया था। इस उदाहरण में मैं अड़चनें पैदा करता हूं और तुरंत उन्हें सक्रिय करता हूं:
label.widthAnchor.constraint(equalToConstant: 250).isActive = true
label.heightAnchor.constraint(equalToConstant: 100).isActive = true
label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor).isActive = true
या उसी का उपयोग करते हुए NSLayoutConstraint.activate()
:
NSLayoutConstraint.activate([
label.widthAnchor.constraint(equalToConstant: 250),
label.heightAnchor.constraint(equalToConstant: 100),
label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor)
])
नोट: बाधाओं को बनाने और सक्रिय करने से पहले पदानुक्रम को हमेशा अपने साक्षात्कारों में जोड़ें ।
मूल उत्तर:
अड़चनें संदर्भ बनाती हैं self.tableView
। चूंकि आप लेबल को एक उप-भाग के रूप में जोड़ रहे हैं self.tableView
, इसलिए बाधाओं को "सामान्य पूर्वज" में जोड़ने की आवश्यकता है:
self.tableView.addConstraint(xConstraint)
self.tableView.addConstraint(yConstraint)
जैसा कि @mustafa और @kcstricks ने टिप्पणियों में बताया है, आपको सेट label.translatesAutoresizingMaskIntoConstraints
करने की आवश्यकता है false
। जब आप ऐसा करते हैं, तो आपको अवरोध के साथ लेबल के उपयोग width
और निर्दिष्ट करने की भी आवश्यकता होती है height
क्योंकि फ़्रेम का उपयोग नहीं किया जाता है। अंत में, आप भी स्थापित करना चाहिए textAlignment
करने के लिए .Center
इतना है कि अपने पाठ अपने लेबल में केंद्रित है।
var label = UILabel(frame: CGRectZero)
label.text = "Nothing to show"
label.textAlignment = .Center
label.backgroundColor = UIColor.redColor()
label.translatesAutoresizingMaskIntoConstraints = false
self.tableView.addSubview(label)
let widthConstraint = NSLayoutConstraint(item: label, attribute: .Width, relatedBy: .Equal,
toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 250)
label.addConstraint(widthConstraint)
let heightConstraint = NSLayoutConstraint(item: label, attribute: .Height, relatedBy: .Equal,
toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 100)
label.addConstraint(heightConstraint)
let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)
self.tableView.addConstraint(xConstraint)
self.tableView.addConstraint(yConstraint)