note_記事見出し_iostips_1280_670_-2B

iOS,Swiftノウハウ集: スタックビューを使ってトルツメ(非表示のUIコンポーネントを詰める)のUIを作る方法

アプリを作っていて、UILabelやUIViewなどの表示・非表示を切り替えたいということがあるかと思います。

スクリーンショット 2020-01-28 17.37.12

上記の例では、天気の表示・非表示ボタンをタップすることで、天気の詳細のラベルを表示したり非表示にしたりできるようにしています。

普通にラベルを非表示にするだけだと、上記のように元々天気の詳細ラベルがあった場所にスペースが出来てしまいます。

ですが非表示の時はこのスペースを詰めたほうがより見栄えの良いUIになりますよね。

スクリーンショット 2020-01-28 17.39.10

このようなUIはUIStackViewを使うと実現できます。

今回はUIStackViewを使って、ラベルを非表示にするときに、そのラベルのスペースを詰めるUIの作り方を説明していきたいと思います。

StoryboardでUIStackViewを使う

早速UIStackViewを使ってみましょう。まずは使う部品を通常通り配置します。

例としてまずUILabelを2つ置きます。ラベルのコンストレイントはheightのみつけておきます。

画像13

次にこの2つのラベルをStackViewに入れます。
まずStoyboardで、先程置いた2つのラベルをShiftを押しながら選択します。
次に下記のスクリーンショットで右下の青で囲まれているアイコンをクリックするとメニューが出てきますので、Stack Viewを選びます。

スクリーンショット 2020-01-28 18.04.13

これだけでラベルがUIStackViewに入りました。

スクリーンショット 2020-01-28 18.02.04

UIStackViewを入れただけだとレイアウトが崩れてしまっています。レイアウトを整えるためにコンストレイトをつけていきましょう。

UIStackViewにコンストレイントをつける

StackViewに対して、top、leading、trailingコンストレイントをつけましょう。値はデザインに合わせて適宜変更してください。

スクリーンショット 2020-01-28 18.09.15

これでレイアウトが整いました。

スクリーンショット 2020-01-28 18.15.32

次にボタンを置いて、ラベルの表示/非表示を切り替えられるようにしましょう。

「天気」と書いてあるラベルの横にボタンを置きます。

スクリーンショット 2020-01-28 18.11.48

ボタンが縦に置かれてしまいました。

StackViewにはVertical(縦)、Horizontal(横)2つの方向(Axis)があり、1つのStackViewの中で2つの方向を混在させることは出来ません。

先程ボタンを追加したUIStackViewの方向は縦方向なので、新たに追加したUIButtonが縦方向に配置されてしまったのです。

UIStackViewのAxisを変更する

縦方向ではなく、ラベルの横にボタンを配置したいので、ラベルとボタンを新しいUIStackViewに入れてAxis(方向)をHorizontalにします。

天気ラベルとボタンをShiftを押しながら選択し、右下のアイコンからStackViewを選択します。これでラベルとボタンがStackViewに入りますが、このままだと方向がVertical(縦)のままなので、Horizontalに変更します。

スクリーンショット 2020-01-28 18.23.49

ボタンのタイトルもStoryboardで設定しておきましょう。

まず通常のボタンの状態(State ConfigがDefault)のタイトルを「非表示」にし、

画像14

つぎに、選択状態のボタンの状態(State ConfigがSelected)のタイトルを「表示」にしておきます。

これで、通常時は、「表示」、タップして選択すると「非表示」となるボタンができました。

画像15

ここからはコードでボタンがタップされたときにラベルの表示非表示を切り替える部分を実装していきます。

まずは、非表示にできるようにしたいラベルをUIViewControllerで宣言します。(名前は適宜変更してください。)

@IBOutlet weak var weatherDescriptionLabel: UILabel!

次に足したボタンのアクションを定義して、ボタンと紐付けます。

@IBAction func secretButtonTapped(_ sender: Any) {
    weatherDescriptionLabel.isHidden = !weatherDescriptionLabel.isHidden
}

これだけで、ラベルの表示/非表示の切り替えが出来るようになっているはずです。

スクリーンショット 2020-01-28 18.25.21

これだけだとラベルが非表示になったときに、その分のスペースがちゃんと詰められているか、ただ非表示になっているだけなのか分かりにくいので下にもう一つUIStackViewを置いて確認してみます。

例として、天気の下に評価のラベルを置いてみましょう。

スクリーンショット 2020-01-28 18.28.06


完成

スクリーンショット 2020-01-28 16.02.00

ラベルが非表示の場合はちゃんとラベル分のスペースが詰められていますね。

まとめ

今回はUIStackViewを使ってトルツメのレイアウトを実現する方法をまとめました。

①UIコンポーネントをUIStackViewに入れる
②UIStackViewにコンストレイントをつける
③UIStackView内のUIコンポーネントをhiddenに設定するとそのコンポーネントの部分が詰まる

画像13


この記事が気に入ったらサポートをしてみませんか?