Cập nhật cho Swift 3 / Swift 4:
Kể từ iOS 8, bạn có thể và nên kích hoạt các ràng buộc của mình bằng cách đặt thuộc tính của chúng isActive
thành true
. Điều này cho phép các ràng buộc tự thêm vào các khung nhìn thích hợp. Bạn có thể kích hoạt nhiều ràng buộc cùng một lúc bằng cách chuyển một mảng chứa các ràng buộc tớiNSLayoutConstraint.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])
Giải pháp tốt hơn:
Vì câu hỏi này đã được trả lời ban đầu, nên các neo bố cục đã được giới thiệu giúp tạo các ràng buộc dễ dàng hơn nhiều. Trong ví dụ này, tôi tạo các ràng buộc và ngay lập tức kích hoạt chúng:
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
hoặc tương tự bằng cách sử dụng 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)
])
Lưu ý: Luôn thêm các chế độ xem phụ của bạn vào hệ thống phân cấp chế độ xem trước khi tạo và kích hoạt các ràng buộc.
Câu trả lời gốc:
Các ràng buộc làm cho tham chiếu đến self.tableView
. Vì bạn đang thêm nhãn làm chế độ xem phụ của self.tableView
, nên các ràng buộc cần phải được thêm vào "tổ tiên chung":
self.tableView.addConstraint(xConstraint)
self.tableView.addConstraint(yConstraint)
Như @mustafa và @kcstricks đã chỉ ra trong các nhận xét, bạn cần đặt label.translatesAutoresizingMaskIntoConstraints
thành false
. Khi bạn làm điều này, bạn cũng cần chỉ định nhãn width
và height
nhãn với các ràng buộc vì khung không còn được sử dụng nữa. Cuối cùng, bạn cũng nên đặt thành textAlignment
để .Center
văn bản của bạn được căn giữa trong nhãn của bạn.
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)