LoginSignup
6
4

More than 1 year has passed since last update.

【Swift】StackViewを活用してAutoLayoutを克服する

Last updated at Posted at 2023-03-01

はじめに

どうも、プログラミング未経験で学習中のはるさんです。
今回はAutoLayoutのStackViewを活用したレイアウト方法について
説明していきたいと思います。

私はAutoLayoutが本当に苦手でした。そんな中、記事や動画を参考にしながら
自身の苦手を克服しつつあるので、その方法をお伝えしたいと思います。
なお、今回は自身のアウトプットも兼ねて記事を書いています。
最後にStackViewを使った実例を載せていますので、そこだけ読みたい方は
目次からそこまで飛ばして読むことをお勧めします。

記事の対象者

  • Swift学習を初めたばかりの方
  • AutoLayoutが苦手な方

筆者の環境

  • Xcode 14.2
  • Swift 5.5.2
  • iOS 16.2

1. AutoLayoutの基本

1-1. AutoLayoutとは

iOSアプリ開発において画面のレイアウトを自動的に調整し、様々なデバイスにあったサイズに
自動で調整してくれる機能です。この機能のおかげで画面サイズの違う機種ごとにレイアウトを
作成しないでも一つのレイアウトでアプリをリリースすることが出来ます。

1-2. ConstraintsとAlignment Constraints

ではどのようにしてサイズを調整するのかというと、Constraints(制約)を設定することで
調整を行っています。この制約とは
対象のViewに対して対象のオブジェクトがどのくらいの距離があるか
を設定することです。その対象が2つあるので簡単に説明します。

Add New Constraint:対象のViewに対する距離の制約

対象のViewというのは大まかに言って2つです。

  • デバイスの画面の端
  • 画面上に配置しているオブジェクト
    Xcode右下あたり、真ん中のアイコンです。
    例えば画像のように紫のUIViewに制約をつけた場合には
    以下のような青い線が引かれて制約がつきます。この時、制約の対象にしているのは
    デバイスの画面の端に対してです。

制約のメニュー画面(中).jpeg制約の例(中).jpeg
このように制約がつくと青い線が引かれます。

上下左右の制約以外にも制約をつけることが出来ますがここでは説明を割愛します。

Add New Alignment Constraints:デバイスの画面に対する絶対座標での制約

一方こちらは画面の絶対座標で制約をつけます。
絶対座標は水平方向のX軸と垂直方向のY軸で決定しています。
選択したViewが一つだった場合には画像のような下の2項目だけが選択可能です。

  • Horizontally in Container – SuperViewに対して水平方向、X軸、左右を調整
  • Vertically in Container – SuperViewに対して垂直方向、Y軸、上下を調整
    アライメントの制約メニュー(中).jpegアライメントの制約例(中).jpeg

こちらは絶対座標なので、デバイスによってははみ出してしまう可能性もあるため
使用頻度は少なめです。

2. StackViewを活用しよう

2-1. StackViewとは?

スタックビュー(中).jpeg

StackViewとは複数のViewを一つの塊として扱えるようにできるものです。
StackViewには次のが2種類あります。

  • 水平方向、横にViewを並べるHorizontal Stack View
  • 垂直方向、縦にViewを並べるVertical Stack View
    ホライゾナル(中).jpegバーチカル(中).jpeg

2-2. StackViewを扱うメリット

StackViewを使うことで、View通しの制約を最小限に抑えることが出来ます。
例えばViewが1、2個しか使わない場合は個別に制約をつければいいのですが、
それが4、5、6個と増えていくとそれだけ複雑になっていきます。
そして、複雑な分制約の矛盾によるエラーや、後からレイアウトを変更しようと
した時に複雑すぎて1から作り直すことになってしまったとりということがおきます。
それを解消してくれるのがStackViewです。

3. レイアウトを組む上での注意点

3-1. 下書きをする

最初の頃ろはいきなりボタンやラベルを貼り付けて、気づいたら
足りないボタンがあって、でも制約つけてたからやり直し!という
ことが起きていました。紙でもツールでもいいので簡単なレイアウト
図を作成して完成イメージを整理してから挑みましょう。
私は今回の記事に執筆にあたってフリーボードという
Apple純正のアプリで作ってみました。
フーボード(中).jpeg
フリーボードで作った下書き

3-2. どこをStackViewにするか考える

下書きをした時点で、どのパーツをどのStackViewで囲むか検討しておくと
後々の作業が円滑に進みます。

3-3. Xcodeの調整項目や機能を調べる

Xcodeは残念ながら全ての文字が英語です。日本語に対応していません。
ですが、どれが何を調整する機能なのかわからないと完成までの道のりは遠いです。
幸い翻訳するのは今時簡単に行えますので、自身で調べてリスト化しておくと良いでしょう。
私は最近流行りのNotionAIやiPhoneの翻訳アプリを活用しました。

ノーションAI(中).jpeg
NotionAIに書いてもらった機能の説明文

iPhone翻(中).jpeg
Iphoneの翻訳アプリ。どちらかいうとエラー文の翻訳向き

3-4. その他注意点

  • 調整段階に入ったらなるべく画面サイズが小さいデバイスで作成する

  • 作成中もこまめにシュミレータを立ち上げて状態を確認する

  • シュミレータは小、中、大のサイズで比較する

  • エディターと実際の見え方は違うことがあるので実物を確認する

  • 制約の値を修正するときはプロパティーエリアの項目から直接選択する
    エディタエリアの制約項目(中).jpeg

  • 大まかにオブジェクトを配置し終わったあとはエディタエリアではなく、
Document Outlineから選択する
    Document Outlineの場所(中).jpeg

  • 制約をつける場合はどのViewに対してつけようとしているのか確認する
    制約対象の確認(中).jpeg

4. StackViewを使ったレイアウト実践

ここからは実際にレイアウトを作っていきたいと思います。
AutoLayoutを習得するにはともかく作って慣れることだと思います。
是非、挑戦してみてください。

完成図

今回はiPhoneSE第3世代、iPhone14、iPhone14ProMaxで比較しながら
作成していきます。
ちなみに背景色やフォント、文章などは見分けがつきやすいように適当に設定しただけ
なので、お好みで変更してください。
完成品(大).jpeg

手順1. Viewのバックグラウンドを変更

背景色変更(中).jpeg

手順2. UIButtonを配置

ボタン1(中).jpeg

フォントを変更
ボタン2(中).jpeg

  • Font: System
  • style: bold
  • size: 20

背景色とボタン自体の色を変更
ボタン3(中).jpeg

一つ目のボタンをコピーして2つ追加
オプションキーを押しながらドラッグ&ドロップして離す、を2回
ボタンコピー.gif

タイトルをキャンセル保存削除に変更
タイトル変更(中).jpeg

簡単に配置
ボタン配置完了(中).jpeg

手順3. UILabelを配置

ラベル配置(中).jpeg

  • タイトル:編集画面
  • Font: System
  • style: bold
  • size: 20

ボタンと同じ要領で4つコピーしてタイトルをそれぞれ名前年齢住所経歴
に変更
ラベル4つコピー(中).jpeg

手順4. UIImageを配置

Imageをperson.fillに、Imageの色、背景色を変更
イメージビューを配置(中).jpeg

手順5. TextFieldを配置

フォント、プレースホルダー変更
テキストフィールド(中).jpeg

  • Font: System
  • style: bold
  • size: 20
  • placeholder: Swift太郎

コピーしてプレースホルダーを変更
テキストフィールドコピー(中).jpeg

手順6. TextViewを配置

TextView配置して住所を入力、フォント変更
住所テキストビュー(中).jpeg

  • Font: System
  • style: bold
  • size: 20

背景色を変更
住所の背景色変更(中).jpeg

経歴のTextViewは新しく追加し、背景色のみ変更
経歴テキストビュー(中).jpeg

手順7. StackViewで小さいグループで囲む

どこで囲むかイメージする
スタックビュー下書き(中).jpeg

StackしたいViewを選択
⌘押しながらクリックして複数選択
スタック部品選択(中).jpeg

Embed InのメニューからStackを選択
スタックメニュー選択(中).jpeg

同じ要領で全てグループ化
全てグループ化(中).jpeg

わかりやすいようにStackに名前つをつける
名前を選択
スタックに名前(中).jpeg

Returnキー押して編集
スタックに名前つける(中).jpeg

同じ要領で全てのStackに名前をつけ、画面と同じようにオブジェクトを並べ替える
スタック名前つけて整列(中).jpeg

  • 今回はView同士が重なるレイアウトではないので単純に上から順にしている。
 本来はSafeAreaの近くに置いたViewは画面の奥に表示され、
逆に遠くに置いた場合は表に表示される。
  • 顔写真を並び替えるときには間違ってStackに入れてしまわないように
注意。顔写真を一番上にした後、タブStackを顔写真の上に持っていくと良い。

手順8. 中くらいグループ、大きいグループのStackで囲む

名前Stackと年齢Stackを中くらいのStackで囲む
Stack名を名前と年齢に変更
中くらいスタック(中).jpeg

全てのオブジェクトを選択してStackで囲む
大きいスタック(中).jpeg

Stack名を全画面に変更
全画面スタック(中).jpeg

手順9. 全画面Stackの調整

エディタの作成画面をiPhone14からiPhoneSE第3世代に変更
エディタをSEに変更(中).jpeg

全画面Stackの位置を画面中央に配置
全画面隙間開ける(中).jpeg
大体で良い。四隅に隙間が空いていればOK

全画面Stackを選択して制約をつける。
上下左右のポイントはに設定、Constrain to marginsのチェックを外す
念の為、制約の対象がSafeAreaになってるか確認する
全画面に制約(中).jpeg

SafeAreaとは
画面上でコンテンツを表示する安全な領域
端末のステータスバー、ホームインジケータ、ノッチや曲面ディスプレイ領域のこと

制約をつけた後はこんな感じ
全画面に制約つけた(中).jpeg

シュミレーターをiPhoneSE第3世代に変更し、実行して確認してみる
シュミレーター選択(中).jpeg
スクショで最初の確認(中).jpeg

全体が枠内に収まっていることを確認。
この時点でTextViewが表示されていないが、後ほど修正する

手順10. タブStackの編集

タブStackを選択してDistributionをFill Equally、Spacingを0
backgroundをTint Colorに変更
タブプロパティ変更(中).jpeg

タブStackを選択して制約を追加。
左右に5ポイントづつつける。対象は全画面Stack。
Heightは40に設定
タブ制約(中).jpeg

タブStackを開いて編集画面ラベルを選択し、Alignmentを中央に変更
編集画面ラベル中央(中).jpeg
この時エディタではキャンセルの文字が2行になっているが、一旦保留

シュミレータで確認
タブ編集完了(中).jpeg
キャンセルの文字は1行に収まっているのでこのままでOK

手順11. 顔写真の編集

顔写真を選択し制約を追加する。
WidthとHeightを共に150に設定。
顔写真編集(中).jpeg

シュミレーターで確認
顔写真の確認(中).jpeg

手順12. 名前と年齢Stackの編集

名前と年齢StackのSpacingを10に設定
名前と年齢スタック編集スペース(中).jpeg

名前と年齢Stackの制約を追加。左右を5に設定
名前と年齢に制約(中).jpeg

名前と年齢Stackを開いて、名前StackのSpacingを10に設定
名前のスペース10(中).jpeg

年齢StackのSpacingを10に設定
年齢スペース10(中).jpeg

シュミレーターで確認
名前と年齢スクショ確認(中).jpeg

手順13. 住所Stackの編集

住所StackのSpacingを10に設定
住所スタックスペース10(中).jpeg

住所Stackの制約を追加。左右5に設定
住所スタック制約5(中).jpeg

住所のTextViewに制約を追加。左だけ10、右と上下は0で設定。
左の制約対象は住所ラベルでOK。
住所テキスト制約左だけ10(中).jpeg

シュミレーターで確認
すると住所が完全に表示されていない。
修正が必要。
住所の確認シュミ、修正必要(中).jpeg

今回は住所StackにHeightの制約を90で設定する
住所stack高さ90で設定(中).jpeg

シュミレーターで確認
住所シュミ確認、調整後(中).jpeg

手順14. 経歴Stackの編集

経歴StackのSpacingを10に設定
経歴Stackスペース10(中).jpeg

経歴Stackの制約を追加。左右5に設定
経歴Stack制約左右5(中).jpeg

経歴のTextViewに制約を追加。左だけ10、右と上下は0で設定。
左の制約対象は経歴ラベルでOK。
経歴テキスト制約(中).jpeg

シュミレーターで確認
経歴シュミ確認(中).jpeg

手順15.削除ボタンの編集

制約を追加。左右に5づつ設定。
削除ボタン制約(中).jpeg

シュミレーターで確認
削除ボタンシュミ確認.png

手順16. 最終調整

名前と年齢StackでSpacingを10に設定したので全画面Stackの
Spacingも10にしておく
最終調整、全体スペース10(中).jpeg

これで完成。
最後にiPhoneSE第3世代、iPhone14、iPhone14ProMaxで確認する。
最終確認、完成(大).jpeg

終わりに

いかがだったでしょうか。私にとってAutoLayoutは本当に苦手な部類です。
最近ではSwiftUIの登場により、もしかしたらStoryboardでのレイアウト作成は
下火になっていくのかもしれません。しかし、諸先輩方からは

「UIKitが原点となってSwiftUIはできている。Storyboardによるレイアウトの基本は学んだほうが
後々役に立つよ!」

と助言をいただきました。私もまだまだ完璧ではありませんが、沢山のレイアウトを作成して
StoryboardによるAutoLayoutを習得していきたいと思います。

この記事が初学者の方々の学習において、少しでもお役にたてれば幸いです。

参考記事

【Swift】超便利StackViewの実践的使い方!まだAutoLayoutで消耗してるの? - Qiita

参考動画

【脱初心者】AutoLayoutの基本を徹底解説

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4