Aggiornamento per Swift 3 / Swift 4:
A partire da iOS 8, puoi e devi attivare i tuoi vincoli impostando la loro isActiveproprietà su true. Ciò consente ai vincoli di aggiungersi alle visualizzazioni corrette. È possibile attivare più vincoli contemporaneamente passando un array contenente i vincoli aNSLayoutConstraint.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])
Soluzione migliore:
Poiché questa domanda è stata originariamente risolta, sono stati introdotti gli ancoraggi del layout rendendo molto più facile creare i vincoli. In questo esempio creo i vincoli e li attivo immediatamente:
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
o lo stesso utilizzando 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)
])
Nota: aggiungi sempre le tue viste secondarie alla gerarchia della vista prima di creare e attivare i vincoli.
Risposta originale:
I vincoli fanno riferimento a self.tableView. Dal momento che stai aggiungendo l'etichetta come una vista secondaria di self.tableView, i vincoli devono essere aggiunti a "antenato comune":
self.tableView.addConstraint(xConstraint)
self.tableView.addConstraint(yConstraint)
Come @mustafa e @kcstricks sottolineato nei commenti, è necessario impostare label.translatesAutoresizingMaskIntoConstraintsa false. Quando si esegue questa operazione, è inoltre necessario specificare il widthe heightdell'etichetta con vincoli perché la cornice non viene più utilizzata. Infine, dovresti anche impostare textAlignmentsu in .Centermodo che il tuo testo sia centrato nell'etichetta.
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)