Aggiornamento per Swift 3/Swift 4:
Come di iOS 8, si può e deve attivare le costrizioni impostando le loro proprietà isActive
a true
. Ciò consente ai vincoli di aggiungersi alle viste corrette. È possibile attivare più vincoli contemporaneamente passando un array contenente i vincoli per NSLayoutConstraint.activate()
let label = UILabel(frame: CGRect.zero)
label.text = "Nothing to show"
label.textAlignment = .center
label.backgroundColor = .red // Set background color to see if label is centered
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])
soluzione migliore:
Poiché tale questione è stato originariamente risposto, sono stati introdotti ancore di layout rendendo molto più facile per creare il vincoli. In questo esempio creo i vincoli e immediatamente li attivare:
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
Nota: aggiungere sempre le subviews alla gerarchia vista prima la creazione e l'attivazione dei vincoli.
risposta originale:
I vincoli fanno riferimento a self.tableView
. Dal momento che si sta aggiungendo l'etichetta come una visualizzazione secondaria di self.tableView
, i vincoli devono essere aggiunti al "antenato comune":
self.tableView.addConstraint(xConstraint)
self.tableView.addConstraint(yConstraint)
Come @mustafa e @kcstricks sottolineato nei commenti, è necessario impostare label.translatesAutoresizingMaskIntoConstraints
a false
. Quando si esegue questa operazione, è inoltre necessario specificare width
e height
dell'etichetta con i vincoli poiché il frame non viene più utilizzato. Infine, devi anche impostare textAlignment
su .Center
in modo che il testo sia centrato nell'etichetta.
var label = UILabel(frame: CGRectZero)
label.text = "Nothing to show"
label.textAlignment = .Center
label.backgroundColor = UIColor.redColor() // Set background color to see if label is centered
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)
IO SONO CREATO QUESTO IN VIEWDIDLOAD. –
Non vedo la riga in cui si aggiunge l'etichetta come sottoview ad un'altra vista. È importante farlo prima di aggiungere vincoli ad esso. –
I am: label = UILabel (frame: CGRectMake (20, 20, 250, 100)) label.text = "Niente da mostrare" self.tableView.addSubview (etichetta) –