Оновлення для Swift 3 / Swift 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)