AutoLayout制約の優先順位

constraint(制約)には優先順位が存在します。

同じ画面でイベントが発生した際にレイアウトの変更が行われる場合優先順位の低い制約を設定しておき発火のタイミングで変更する際便利です。

2つのTop Alignment Constraint

今回はTop Alignment Constraintに2つ制約をつけました。同じ制約がついていてもエラーになりません。

①constraintの変更

片方のTop Alignment Constraintを0に設定してみました。するともう片方のTop Alignment Constraintが60の制約を持っていたのでエラーが発生します。

②priorityの変更

今回の本題です、Priorityの数値を変えて制約の優先順位を変更します。

デフォルトでは1000に設定されています。今回はTop Alignment Constraintが0の制約を750に設定しましたがPriorityの値が高い制約を優先してViewの位置を決定します。

Priorityの異なる制約が存在する場合点線で表示されます。

ボタンタップで制約を変えてみる

ボタンを作って制約を変更するミニマムなコードを作りました。

priorityの高い制約をoutlet接続しボタンが押されたタイミングでisActiveをfalseにしています。

コード

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var topConstraint: NSLayoutConstraint!
    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func changeConstraint(_ sender: Any) {
        topConstraint.isActive = false
    }
    
}