【Swift】Resolve Auto Layout Issuesの使い方。制約の更新、自動調整、一括削除を行う。(Swift 2.1、XCode 7.2)

2020年6月16日

Resolve Auto Layout Issuesとは

本記事ではAuto Layout(以下、オートレイアウト)を使って制約を追加したときに使うResolve Auto Layout Issues(以下、リゾルブ)について説明する。

オートレイアウトの使い方については過去の記事で説明しているので、そちらを参照されたし。⇒「記事

リゾルブとは、制約を追加したあとの更新、自動調整、削除作業をサポートしてくれる機能である。下図赤枠のボタンを押すとコマンドを選択する画面が開く。

Resolve Auto Layout Issuesのメニュー

 

過去の記事ですでに紹介したコマンドもあるが、復習も兼ねて改めて説明しておく。

リゾルブ機能は、選択した部品のみ(Selected Views)に対して実行するものと、View Controllerに含まれるすべての部品(All View in View Controller)に対して実行されるものがある。実行対象が異なるだけで、実行内容は両者同じである。

以下にリゾルブの機能の一覧をまとめる。

設定名 説明
1 Update Frame デバイス画面を更新する。部品が制約どおりの位置にいない場合、これを実行すれば制約どおりの位置に部品を移動してくれる。
2 Update Constraints 制約を更新する。制約を追加したあとに別の位置に移動した場合、これを実行すれば現在位置が制約の位置になるように制約を更新してくれる。
3 Add Missing Constraints 足りない制約を自動で追加してくれる。
4 Reset to Suggested Constraints 制約を最適化するために、新しい制約の登録、既存の制約の修正削除をしてくれる。
5 Clear Constraints 登録されている制約を一括削除する。

1つずつ確認する。

Update Frame

部品を制約どおりの位置に移動してくれるコマンド。

部品の位置が制約と異なる場合、下図のように黄色い線と四角枠が表示される。黄色い四角枠は制約の位置であり、アプリを起動するとそこに部品が表示される。そこでUpdate Framesを実行すれば部品が制約の位置(黄色い四角枠)に移動する。

Update Framesを選択する前

 

Update Constraints

部品の制約を更新するコマンド。

下図青矢印のように、制約を追加した部品をドラッグ&ドロップで移動する。そして、Update Constraintsを実行すると、現在位置に合わせて制約を更新してくれる。

auto_layout_update_constraints2

Add Missing Constraints

足りない制約を自動で追加してくれるコマンド。

例えば、下図のようにデバイス画面にラベルを2つ配置し、2つのラベルに水平方向の制約(下図赤枠)のみ追加したとする。この状態でAdd Missing Constraintsを実行するとどうなるか。

Add Missing Constraintsを実行する前

 

すると2つのラベルに垂直方向の制約が追加される。ラベル2には画面上端までの距離、ラベル1にはラベル2までの距離、というように部品の場所に応じて適切と考えられる制約が自動で追加される。

Add Missing Constraintsを実行したあと

 

Reset to Suggested Constraints

制約を最適化するために、新しい制約の登録、既存の制約の修正削除をしてくれるコマンド。

例えば、下図のようにデバイス画面にラベルを1つ配置し、水平方向のみの制約(ラベル左端から画面右端までの距離)を追加した。この状態でReset to Suggested Constraintsを実行するとどうなるか。

Reset to Suggested Constraints

 

垂直方向の制約が追加され、水平方向の制約は「画面右端からラベル左端までの距離」に修正された。

Reset to Suggested Constraintsを実行したあと

 

Clear Constraints

制約を一括削除するコマンド。

制約を選択してDeleteボタンで削除することもできるが、制約が増えてくると消したい制約を探すのに苦労する。そんなとき、部品を選択してClear Constraintsを実行すれば、その部品に追加した制約をすべて削除してくれる。

例えば、下図のように8個の制約が登録されている状況で、ラベル1を選択してClear Constraintsを実行するとどうなるか。

Clear Constraintsを実行する前

 

ラベル1の制約のみが削除された。

Clear Constraintsを実行したあと