[Swift]StackViewとhiddenを使って画面を作成したこと

## 概要
StackViewを作ってその中のLabelをhiddenでトルツメをするという作業を行ったのでメモしたいと思います。


## やりたいこと
StackView、トルツメを使った名前入力画面の作成

↓適当に必要な要素を配置した画面を作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/f046bde6-bee5-590d-3f40-9fd2569760b1.png)


### それぞれの要素ごとにやりたいこと

①画面のタイトル(概要)ラベル
・名前入力画面の概要として表示位置は固定で置きたい

②名前を入力するTextField
・ここで名前を入力させる
・名前入力に不備があった場合はエラー(④⑤)を表示させたい


③次の画面に遷移するボタン
・名前入力に不備があった場合は遷移させずにエラーを出したい
・名前入力に不備がない場合は次の画面に遷移させたい

④⑤名前入力で不備があった場合に出現するエラーラベル
・通常時はエラーラベルは隠しておきたい
・エラーラベル非表示は②TextFieldは①タイトルラベルの下におきたい
・③ボタンを押した時に不備があった場合、②の上にラベルを出現させたい

## 今回StackViewで実現させたい動作

```
・名前入力に不備があった場合はエラー(④⑤)を表示させたい
・通常時はエラーラベルは隠しておきたい
・エラーラベル非表示は②TextFieldは①タイトルラベルの下におきたい
・③ボタンを押した時に不備があった場合、②の上にラベルを出現させたい
```
### 上記をStackViewで実現させていきます。

`Storyboard上の手順`
1.二つのエラーラベルを選択状態にする(commandを押しながらクリック)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/e42f3585-22d4-3ebb-71f7-f880ba1d62b1.png)

2.Embed Inをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/9e6aa755-989c-1bd3-92ea-b3850cd966ac.png)

3.StackViewをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/cfde8fb3-5e72-78e3-9047-963d078e15c0.png)

↓クリックすると、選択状態にしていた要素がまとまる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/97ef8ad5-601b-78d7-010f-947ab2ba3cbc.png)

4.StackViewとTextFieldを選択状態にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/4e47e535-9001-dacc-356c-6851861a233a.png)

5.2~3と同様の手順を再度行う(Embed In → StackView)

↓StackViewとTextFieldが更にStackViewでまとまる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/d4c2ce9d-ff5e-9d7f-dfdf-23ac6d973af1.png)


6.一番上のStackViewに制約をつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/483ae8f9-8754-a89c-d401-1e0292c46c5a.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/da3d0ceb-f60d-0f4c-dd68-0f890233b661.png)

7.StackView内の要素毎のスペースを決める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/4a2ba638-4686-2700-1f3b-fcfe52733c98.png)


ここまででStoryboard上の作業は完了です。


`ViewControllerでの手順`

```
class ViewController: UIViewController {

// 1.エラーラベルのStackViewを接続(errorStackView)
    @IBOutlet weak var errorStackView: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()

// 2.画面表示時にerrorStackViewをhiddenで非表示にさせる
        errorStackView.isHidden = true

    }

    @IBAction func tapButton(_ sender: Any) {
// 2.ボタンタップ時にエラーが出る仮定として出現させる
         errorStackView.isHidden = false
    }

}
```


## 完成！
シュミレーターを起動するとちゃんとerrorStackViewが非表示されてTextFieldがトルツメされている!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/f478a4fc-1405-767c-58b3-a99f188e3091.png)

↓ボタンをタップするとerrorStackViewが出現！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473856/4e4a9275-93c8-d929-c005-5e7c6210c361.png)


## まとめ
今回は本文に記載しているような画面を作ることになり、トルツメでエラーを出したくていろいろ調べた結果実装できたのでメモしてみました。
StackViewを使わなくても実現できるみたいですが、StackViewの方が簡単でわかりやすかったです(今回のエラーラベルみたいに要素が複数あるときはStackViewの方がよりやり易いと思います)。

StackViewとは何かは以下の記事がとても参考になりました！
https://qiita.com/kinopontas/items/d08f84dbb711c5acbe28