1. Layout Anchors

// Get the superview's layout
let margins = view.layoutMarginsGuide
 
// Pin the leading edge of myView to the margin's leading edge
myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor).isActive = true
 
// Pin the trailing edge of myView to the margin's trailing edge
myView.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true
 
// Give myView a 1:2 aspect ratio
myView.heightAnchor.constraint(equalTo: myView.widthAnchor, multiplier: 2.0).isActive = true

2. NSLayoutConstraint Class

1 의 방식과 달리 레이아웃에 영향을 주지 않더라도 각 매개 변수에 대한 값을 지정해야 한다.

NSLayoutConstraint(item: myView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = true
 
NSLayoutConstraint(item: myView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true
 
NSLayoutConstraint(item: myView, attribute: .height, relatedBy: .equal, toItem: myView, attribute:.width, multiplier: 2.0, constant:0.0).isActive = true

iOS 8 또는 OS X 10.10 또는 이전 버전을 지원해야하는 경우가 아니라면 Layout Anchors 방식으로 마이그레이션하는 것이 권장됨

3. Visual Format Language

문자열과 같은 ASCII를 이용해 제약 조건을 정의할 수 있음

let views = ["myView" : myView]
let formatString = "|-[myView]-|"
 
let constraints = NSLayoutConstraint.constraints(withVisualFormat: formatString, options: .alignAllTop, metrics: nil, views: views)
 
NSLayoutConstraint.activate(constraints)
제약 조건 Visual Format Language Image
표준 공간 [button]-[textField] 표준 공간
폭 제약 [button(>=50)] 폭 제약
Superview에 연결 \|-50-[purpleBox]-50-\| Superview에 연결
수직 레이아웃 V: [topField]-10-[bottomField] 수직 레이아웃
플러시 뷰 [maroonView][blueView] 플러시 뷰
우선 순위 [button(100@20)] 우선 순위
동일한 폭 [button1(==button2)] 동일한 폭
Multiple Predicates [flexibleButton(>=70, <=100)] Multiple Predicates
A Complete Line of Layout \|-[find]-[findNext]-[findField(>=200)]=\| A Complete Line of Layout

참고 자료