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)