iOS学習初期に作成したアプリをユニバーサルアプリになるように作り直してみた

この記事は株式会社アクシス [Advent Calendar](https://qiita.com/advent-calendar/2020/mediaxis) 25日目の記事です。

半年ほど前にiOSのキャッチアップで最初に電卓を作成したのですが、
出来心でビルドしてみたらiPhone11を持っている選ばれし者にしかまともに使えない(UIが崩壊する)電卓になっていたのでiPadまで綺麗に表示できるのを目指して修正します。
## ユニバーサルアプリとは
- 様々なタイプのデバイスに対応するアプリをさします

## 現状
- iPhone11では少しガタガタではございますが、まぁ何とか使えるぐらいだと思います！
- iPadはご覧の通りでございます！

| iPhone11 | iPad |
| -------- | -------- |
|![qita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/eeb76da5-278c-4875-78bf-7c16152be628.png)|![qita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/f901d4c9-be71-7d65-eade-6953a2af57b7.png)


### 制約について
- 一つ一つのオブジェクトが隣のオブジェクトとの制約を数珠つなぎのように持っていて、どこかで辻褄が合わなくなりiPad画像のように崩壊していました

## 作り直し
- 一旦、制約を全部外して1から作り直します

### 前提
- `"式"`と`"答え"`以外のオブジェクトのWidthとHeigthが等しい

### 1.上部(式と答えの部分)の修正
- `"="のlavel`&`"答え"のlavel`の横StackVIew("HorizontalStackView")と`"式"のLavel`を縦のStackView("VerticalStackView")にいれる
- `"="のlavel`と`"答え"のlavel`のStackView"のSpacing"を32に設定する
  -  `"="のlavel`と`"答え"のlavel`のStackViewと `"式"のLavel`の隙間を32pixel空ける為
- `"="のlavel`と`"答え"のlavel`のStackViewのSpacingを16に設定する
  - `"="`と`"答え"`のlavelの隙間を16pixel空ける為

- 式の文字を中央に寄せる

### 途中経過1-1
- 現状はこんな感じ
![qita10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/f4b2780d-2961-fd47-37ef-2528f77de911.png)


### 2.数字と演算子を横のくくりでまとめる
- `C`と`÷`、`7`と`8`と`9`と`×`のように横のオブジェクトを`HorizontalStackView`に格納する
- `C`と`÷`、`0`と`=`はオブジェクトが2つしか無いのでバランスを取るために空の`Label`を挿入する

### 途中経過2-1
- 上記の通り作成すると以下のようになる
<img width="1680" alt="スクリーンショット 2020-12-21 15.18.51.png (2.2 MB)" src="https://img.esa.io/uploads/production/attachments/14654/2020/12/21/70945/2806a932-9323-4afc-96e1-3b49b84c98b2.png">

- オブジェクト一つ一つの幅がバラバラなので統一する
  - StackViewを選択して"DistrlbutionをFill Equally"に設定する
  ![qita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/49250c8e-088f-5f92-e9cb-df7ea7cae79f.png)

  - これを数字と演算子をまとめたStackView全てに行う

- オブジェクト同士が密接しているので少し離す
  - StackViewを選択して"Spacing"を32に設定する
  - これを数字と演算子をまとめたStackView全てに行う

### 途中経過2-2
- ここまで行うと以下のようになる
![qita11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/50475c7a-d3d5-7a0f-77e0-0a81bac1b828.png)



### 3.数字と演算子の横で括ったStackViewを縦で括って1つの塊にする
- StackVIewで作成した列(HorizontalStackView)を順番にVerticalStackViewに格納する
- 横の列同士の縦が密接しているため隙間を空ける
- 縦でまとめたStackVIewを選択し、Spacing"を16に設定する

### 途中経過3-1
- 制約が入っていないため見切れているが、オブジェクトのサイズや位置も均等になっている
![qita12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/dffd818d-d8fb-79e2-a22e-c08c15baeb17.png)


### 4."式と答え"のStackViewと"数字と演算子"のStackVIewを一つの塊にして画面の中央に設置する
- 3と同じ要領で"式と答え"のStackViewから順番にVerticalStackViewに格納する
- 格納した後に、全体をまとめたStackVIewを選択し”Add New Alignment Constraints”を選択、"Horizontally in Container"と"Vertically in Container"を共に0に設定して中央に設置する
![qita13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/7e1ab514-0e5b-f6f6-9e8c-0ad4df638b61.png)

### 途中経過4-1
- 全体が中央に設置されたため、細かい制約を入れていく
![qita14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/e90c0d43-b9a8-f96a-7f88-3b6576019cf1.png)

### 制約を設定
- 両端からから~pixelの制約をいれることによって画面の横サイズ合わせてある程度動的に中のオブジェクトのサイズが決まってくるようにする(縦は中央から始まるように4で設定済み)
- 全体が格納されているStackView(※以後、mainStackView)を選択し"Add New Constraints"を選択、左(Leading)と右(Traliling)を48に設定する
![qita15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/9ab81e84-a5dc-6ad8-7604-46833096fe1f.png)


- 式と答えのStackViewと数字と演算子のStackViewの間を離す
  - mainStackViewのSpacing"を48に設定する
 
![qita16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/0139caf8-f872-e4de-5099-f70e9cdace25.png)


## BeforeAfter 
### iPhone11
| before | after |
| -------- | -------- |
|![qita5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/ba4319a0-4bc1-5b03-08b0-b7ab61d45d02.png)| ![qita6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/2e272eb9-32ca-e910-316e-10d24190988a.png)

### iPad
| before | after |
| -------- | -------- |
| ![qita7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/f35ac4db-10cd-d54b-865f-5086d104b20f.png)|![qita8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657899/9eeae157-c199-e0e9-4e75-af0a01b5590b.png)


## 感想
一つ黒歴史を精算できたようなスカッとした気持ちになれたのでやってよかったなと思いました。
StackViewに空のViewを入れたり、vary for traitsを使用しなかったりちょいちょい横着は目立ちますが、どの端末でも割と綺麗に表示されるようになったので今回はこのぐらいで失礼します。