【swift】 Autolayout-基礎編-

## AutoLayoutとは
XcodeのStoryboard上で配置したパーツが異なる端末で違う見え方をする場合があります
画面の大きさが端末によって異なるため、各パーツの大きさや余白の設定が不十分な場合に発生するためです💡
|iPhoneSEで起動した時|iPhone13ProMaxで起動した時|
|---|---|
|![SE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/5fafe692-fd35-4c4a-4304-6ded8b17f51b.jpeg)|![13Promax.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/415ef7dc-9fe8-b339-9b68-2cb2cefe52b5.jpeg)|

(画像はhttps://qiita.com/naoking21/items/08932587b9fdb337b3df より引用)

AutoLayout(制約)を利用して各パーツに設定を加えることで一定のレイアウトを維持して表示することが可能になります！
AutoLayoutの設定は.xibや.storyboardを編集することで設定可能です。
## ハンズオン
実際にXcode上でAutoLayoutを設定してみましょう🙋‍♂️
**プロジェクトの準備**
1. プロジェクトを作成する際に、Interface(下画像①)をStoryboardに変更してEnter押下もしくはNextをクリックし、プロジェクトを作成。(今回はAutolayoutという名前のプロジェクトを作成)

![pic1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/1999cd99-26aa-4af5-232c-556d122b54dc.png)
2. Main.storyboard(下画像①)を選択し、下画像②をクリックもしくは(Shit+Command+L)押下でライブラリを表示する
![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/cba15c95-666f-ba1f-247b-5db07cb26ac4.png)
3. 下画像①の箇所にuiviewと入力し、View(下画像②)を下画像③の位置にドラッグ&ドロップしてView上にのせる。

![pic3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/f51a3dd9-dce2-6e2b-c834-45a99b5ae845.png)

### Constraintsの設定
4. 置いたViewを選択状態のまま、下画像①のアイコンをクリックして下画像②のBackgroundをLight Gray Colorに変更する。
左側のView一覧から置いたView(下画像③)を２回クリック(ダブルクリックより間隔を長く)し、テキストを入力してViewの名前が変更できるようになるのでbackgroundViewとする。
下画像④のアイコンをクリックしてAdd Constraintのメニューを表示し、
下画像⑤の円の内側にある4つの数字(**最も近いViewに対する余白を表す数字で、上下左右それぞれ上の余白・下の余白・左の余白・右の余白**)を全て0にし、各数字の内側にある印(各余白のON/OFFを表し、下画像⑥は上余白に対するもの)が薄くなっていないか確認する(薄くなっていればクリックして色を戻す)。
下画像⑦のボタンをクリックもしくはEnterを押下で制約を追加する。
![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/2ad46297-d04f-b6e0-4777-17d837e8baa3.png)
### 解説
backGroundViewに対する操作を下記図にあるlightGrayViewに照らし合わせて説明すると、lightGrayViewのTop margin, Trailing margin, Bottom margin, Leading marginを0と設定し、下記図解右のようにlightGrayViewを広げる操作となる。
このように上下左右の余白を設定する際、下記図解のBottom marginのように、各方向で最も近くにあるViewに対する余白が設定され、Viewがない場合はSuperViewに対する余白が設定される。
下記図でいうと、lightGrayViewの下方向にはotherViewがあるためBottom marginはotherViewへの余白となり、上、左、右方向にはViewがないためSuperViewに対する余白となる。


2.backgroundViewがSuperViewに対して上下一杯に広がることを確認する。
![pic8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/34bfd437-f4cb-5d9b-f268-1665666c213a.png)

3.backgroundViewを設置したのと同様な手順で、下画像のように新しく2つ上下にViewを配置し、下記設定にしておく。
上のView: BackgroundをWhite Color, 名前をwhiteView
下のView: BackgroundをBlack Color, 名前をBlackView
![pic9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/4e0bf96b-a27a-ba59-de33-131d0046921f.png)

4.whiteViewを選択状態にし(下画像①のViewをクリック)、Cosntraintsのアイコン(下画像②)をクリックしAdd Constraintsのメニューを表示させ、上余白(下画像③)と左余白(下画像④)を0にする。(余白内側の印でOnになっていることを確認)
Widthの値(下画像⑤)の値を240, Heightの値(下画像⑥)を128とし、下画像⑦, ⑧にチェックが入っていることを確認する。
下画像⑨のボタンをクリックもしくはEnterを押下してwhiteViewにConstraintsを追加する。

![pic10-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/04294656-0510-4694-b53e-e50e091ddcac.png)

5.whiteViewを選択(下画像②をクリック)して下画像③のタブをクリックし、下画像④の円内及び、whiteViewの配下及びbackgroundView配下のConstraints(下画像①の円内)にwidth, height, leading, topのConstraintsが増えていることを確認する。
![pic12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/d7176072-8004-4a52-ccc5-e133870cd12f.png)

6.5と同様に、blackViewにもConstraintsを設定する。
blackViewを選択(下画像①のViewをクリック)し、下画像②のアイコンをクリック、上余白(下画像③)と右余白(下画像④)の値を0にする。width(下画像⑤)を240, height(下画像⑥)を128にし、下画像⑦, ⑧にチェックマークが入っているかを確認する。
下画像⑨のボタンをクリックもしくはEnter押下でblackViewにConstraintsを追加する。

![pic13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/9b0d5d59-48ef-d4f9-18fd-5ebf74b2e6fb.png)

7.5と同様にblackViewにConstraintsが追加されていることを確認する。
blackViewを選択(下画像①をクリック)して右側ペインのConstraintsのタブをクリックし、下画像③の円内及び、blackViewの配下及びbackgroundView配下のConstraints(下画像②の円内)にwidth, height, trailing, bottomのConstraintsが増えていることを確認する。
![pic14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/3cc70df6-9033-e297-6fb7-92c057a6d987.png)

8.blackViewの幅を少し変更するため、widthのConstraintに対するEditボタン(下画像①)をクリックし、下画像②にある値を360にしてEnterを押下。すると、blackViewの幅が240から広がることが確認できる。
![pic15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/dae247d5-236c-bb99-9ca4-b8830f4e453b.png)

### 実際に確認しよう！
上記で設定した**Constraintがどのように反映されているかを確認することは、UIが仕様通りになっているかを確認する上で非常に重要になります**。下記手順で複数端末でのレイアウトを確認しましょう。

下画像①のView as… というボタンをクリックすると、下画像②円内のように、様々な機種が表示される。
その中から機種をクリックすることで、画面上のViewの大きさが選択された機種に合わせられるので、複数機種で確認する。
今回の例だと、iPhoneSE(第一世代)以下の大きさだとblackViewが画面いっぱいに広がり、左側に余白が見えなくなる事が確認できる。

![pic16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/c0874de2-82db-2510-db19-5a3f2f9875c4.png)

この際、デザインがどのような仕様になっているかで解決方法は変わるが、今回はiPhone4s(全機種で最も横幅が小さい)でもViewが画面からはみ出ることながないようにすれば良いこととする。
そのため、下記手順に沿ってblackViewのwidthを修正する。
blackViewを選択し、下画像①のEditを押してWidthのConstraintの詳細を出す。
下画像の値を320(iPhone4sの横幅と同値)とする。
iPhone4sでもblackViewが画面内に収まることが確認できる。

![pic17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/e9fd6325-9b4f-6473-67fc-df36e340503e.png)

### 用語
Top margin – 上側の余白
Bottom margin – 下側の余白
Leading margin – 左側の余白
Trailing margin – 右側の余白
Width – Viewの幅
Height – Viewの高さ
SuperView(Container) – あるViewの土台となっているView（下記図解のSuperViewは、lightGrayViewとotherView両方のSuperViewとなる）、親Viewとも言われる。
![用語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483508/926035c5-02cd-a443-afec-4ab4cd62bd87.png)

### 最後に
今回のAutolayoutに関する説明は、上下左右の余白、heightとwidthでの設定方法を説明しましたが、それだけでは柔軟にレイアウトを組むのは難しいかもしれません。次回は複数View間の相対的な並びを揃える方法をベースに説明していきます。