Swiftで理解するZStack!完全ガイドのたった10の方法

SwiftUIのZStack使用時のイラストとサンプルコードのスクリーンショットSwift
この記事は約18分で読めます。

※Japanシーモアは、利用目的を問わず掲載されているコードの再利用が可能です。常に解説内容のわかりやすさや記事の品質に注力しておりますので、不具合・分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。(理解できない部分などの個別相談も無償で承っております)
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftでは、ビジュアルなUIコンポーネントを簡単に構築できる機能が豊富に提供されています。

SwiftUIの中で、特に注目すべきは「ZStack」です。

この記事では、ZStackの使い方やその特性、カスタマイズ方法、そして応用例まで、徹底的に解説していきます。

実践的なサンプルコードも10例付きで紹介するので、初心者の方でもZStackを効果的に利用する方法を習得できるでしょう。

●ZStackとは

ZStackはSwiftUIにおけるビューの1つで、複数のビューを重ねて表示するためのコンテナです。

文字通り、Z軸方向にビューをスタックすることができます。

例えば、背景画像の上にテキストやボタンなどの要素を配置する際にZStackを利用することが多いです。

○ZStackの基本的な概念

ZStackを理解するための最も基本的なポイントは、子ビューがZ軸方向(前後方向)に重ねられることです。

この重ねる順番は、ZStack内でのビューの定義順に依存します。

最初に定義されたビューが最も下になり、次に定義されたビューがその上に配置されるというように、ZStack内での定義順に重ねられていきます。

また、ZStackはコンテナとしての役割を持っているので、中には複数の子ビューを持つことができます。

そして、これらの子ビューはZStack内で自由に配置やアライメントを変更することが可能です。

このような特性を持つZStackは、柔軟なUIデザインを実現する上で非常に有用です。

特に、背景となるビューの上に別のビューを重ねることで、複雑なデザインやアニメーションを簡単に実現することができます。

●ZStackの使い方

ZStackはSwiftUIで提供されるコンテナビューの一つで、複数のビューを重ねて表示することができます。

重要な点は、ZStack内のビューは「奥から手前」に向かって重なるということです。

これにより、背景となるビューの上に他のビューを配置することが可能となります。

○サンプルコード1:基本的なZStackの使用方法

SwiftでのZStackの基本的な使い方を見ていきましょう。

下記のサンプルコードでは、簡単なZStackを作成し、その中に複数のビューを重ねています。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.green
                .edgesIgnoringSafeArea(.all)
            Text("Hello, world!")
                .font(.largeTitle)
                .foregroundColor(.white)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

このコードでは、ZStackを使って緑色の背景の上に「Hello, world!」というテキストを配置しています。

Color.green.edgesIgnoringSafeArea(.all)により、画面全体を緑色で覆い、Textビューにより白色のテキストが上に表示されます。

ZStackの中で、ビューは上に書かれた順に画面上に表示される点に注意してください。

実行すると、緑色の背景上に大きな白い文字で「Hello, world!」と表示されます。

○サンプルコード2:ZStackでの要素の重ね順の制御

ZStack内でビューの重ね順をコントロールするには、ビューの順序を調整する必要があります。

下記のサンプルコードでは、三つの異なる色のビューを重ねています。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.red)
                .frame(width: 200, height: 200)
                .zIndex(1) // zIndexを設定
            Rectangle()
                .fill(Color.blue)
                .frame(width: 150, height: 150)
                .zIndex(2) // zIndexが高いほど前面に表示
            Rectangle()
                .fill(Color.yellow)
                .frame(width: 100, height: 100)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

このコードでは、zIndexプロパティを使って各ビューの重ね順を調整しています。

zIndexの値が大きいほどビューは前面に表示されます。

この例では、青い四角が最も手前、次いで赤、そして黄色の四角が最も奥に表示されます。

実際にこのコードを実行すると、青、赤、黄色の四角が順に重なって表示されることが確認できます。

○サンプルコード3:ZStack内でのアライメントの指定方法

ZStack内でのビューの配置は、デフォルトでは中央になりますが、アライメントを指定することで変更することができます。

下記のサンプルコードでは、アライメントを使用してビューの配置をカスタマイズしています。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack(alignment: .topLeading) {
            Color.orange
                .edgesIgnoringSafeArea(.all)
            Text("左上")
                .font(.largeTitle)
                .foregroundColor(.white)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

ここでは、ZStackのalignmentパラメータに.topLeadingを指定しています。

これにより、ZStack内のビューは左上に配置されます。

上記のコードを実行すると、オレンジ色の背景に「左上」というテキストが左上に表示されます。

●ZStackの応用例

ZStackはその名の通り、ビューをZ方向(前後)に積み重ねることができる非常に強力なコンポーネントです。

基本的な使い方から、より高度な応用例まで、ZStackはSwiftUIのアプリケーション作成において欠かせない要素となっています。

ここでは、その応用的な使い方に焦点を当てて解説を行います。

○サンプルコード4:ZStackを使ったモーダル表示

モーダル表示はアプリ内で非常によく使用されるUIパターンの1つです。

ZStackを利用すれば、モーダルを手軽に実装できます。

ここでは、基本的なモーダル表示のサンプルコードを紹介します。

import SwiftUI

struct ModalView: View {
    @Binding var isPresented: Bool

    var body: some View {
        ZStack {
            Color.black.opacity(0.4)
                .edgesIgnoringSafeArea(.all)
            VStack {
                Text("これはモーダル表示です")
                Button("閉じる") {
                    isPresented = false
                }
            }
            .frame(width: 300, height: 200)
            .background(Color.white)
            .cornerRadius(20)
        }
    }
}

このコードでは、ZStackを使って半透明の黒背景とモーダルの内容を重ねて表示しています。

この例では、Buttonをクリックすることでモーダルを閉じることができます。

モーダル表示をする場合、isPresentedという@Bindingを使った変数を使用して表示・非表示を切り替えることができます。

この変数の値がtrueの時にモーダルが表示され、falseの時に非表示となります。

○サンプルコード5:ZStackでのアニメーションの実装

ZStackを利用すれば、各種アニメーションも容易に実装できます。

下記のサンプルコードは、ZStack内のビューにアニメーションを適用した例を表しています。

import SwiftUI

struct AnimatedView: View {
    @State private var scale: CGFloat = 1.0

    var body: some View {
        ZStack {
            Circle()
                .fill(Color.blue)
                .scaleEffect(scale)
                .onTapGesture {
                    withAnimation {
                        scale = (scale == 1.0) ? 2.0 : 1.0
                    }
                }
        }
    }
}

この例では、青色の円が表示され、その円をタップすることでサイズが変わるアニメーションが実行されます。

withAnimationを使用してアニメーションの効果を適用しています。

実際に上記のコードを実行すると、円をタップするたびに円のサイズが変わるアニメーションが行われることが確認できます。

○サンプルコード6:ZStackと他のSwiftUIビューとの組み合わせ

ZStackは単体で使用するだけでなく、他のSwiftUIビューと組み合わせることも多いです。

ここでは、ZStackとRectangleビューを組み合わせたサンプルコードを紹介します。

import SwiftUI

struct CombinedView: View {
    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.green)
                .frame(width: 150, height: 150)
            Text("ZStackの上にテキスト")
        }
    }
}

このコードでは、ZStackの下に緑色のRectangleビューを、上にテキストを配置しています。

ZStackを使うことで、簡単にビューを重ね合わせることができます。

上記のコードを実行すると、緑色の四角の上に「ZStackの上にテキスト」という文字が表示されることが確認できます。

●注意点と対処法

SwiftUIにおけるZStackの利用は直感的でありながら、いくつかの重要な注意点が存在します。

これらの注意点を理解し、適切な対処法を採用することで、ZStackを効果的に活用することができます。

○ZStack内でのビューのサイズと配置に関する注意

ZStackは複数のビューを重ね合わせる際に使用されますが、内包するビューのサイズと配置には特別な注意が必要です。

デフォルトでは、ZStackは内包するビューを中央に配置し、最も大きなビューに合わせてサイズを調整します。

これは意図しないビューの表示を引き起こす可能性があります。

対処法として、ビューのサイズや位置を明示的に指定することが重要です。

Frameを用いてサイズを設定し、Alignmentを使って配置を調整します。

下記のサンプルコードでは、ZStack内のビューのサイズと位置を明示的に定義しています。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack(alignment: .topLeading) {
            Color.green
                .frame(width: 200, height: 200)

            Text("上端左寄せ")
                .alignmentGuide(.top) { d in d[.top] }
                .alignmentGuide(.leading) { d in d[.leading] }
        }
    }
}

このコードでは、ZStackの中に色とテキストビューを重ねて配置しています。

緑色の四角形が基準となり、その上に「上端左寄せ」というテキストが配置されています。

ZStackのalignmentプロパティを.topLeadingに設定することで、ビューが左上端に配置されるように指定しています。

○ZStackの深度の最大値とその対処方法

ZStackにビューを多数重ねる場合、パフォーマンスに影響を及ぼす可能性があります。

特に、重ねるビューの数が増えると、レンダリングの処理負荷が高まり、アプリの応答性が低下する可能性があります。

対処法として、ZStack内で重ねるビューの数を最小限に抑えることが推奨されます。

また、不必要なビューは条件付きで表示する、または別のビュー構造に分けることで、深度を最適化できます。

下記のサンプルコードでは、ZStackのビューを条件付きで表示し、深度を管理しています。

import SwiftUI

struct ContentView: View {
    @State private var isShowingRed = false

    var body: some View {
        ZStack {
            Color.blue
                .frame(width: 200, height: 200)

            if isShowingRed {
                Color.red
                    .frame(width: 100, height: 100)
            }
        }
        .onTapGesture {
            isShowingRed.toggle()
        }
    }
}

この例では、青色の四角形が常に表示され、赤色の四角形はユーザーのタップ操作によって表示・非表示が切り替わります。

これにより、不要な時には赤色の四角形をレンダリングから除外し、パフォーマンスを最適化しています。

●ZStackのカスタマイズ方法

ZStackはSwiftUIで非常に使いやすく、柔軟性が高いため、カスタマイズの幅が広いのが特徴です。

ここでは、ZStackのカスタマイズに関するさまざまな方法を紹介します。

○サンプルコード7:ZStackの背景色のカスタマイズ

ZStack自体には背景色のプロパティが直接存在しないため、背景としてColorビューを使用して背景色を設定する方法が一般的です。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.blue.edgesIgnoringSafeArea(.all) // 背景色を設定
            Text("Hello, ZStack!")
        }
    }
}

このコードでは、ZStack内でColorビューを使用して背景色を青に設定しています。

edgesIgnoringSafeArea(.all)を使用することで、安全領域を無視して画面全体に色を適用しています。

この例では、ZStackの中でColorビューを最初に配置することで、後ろにあるビューとして背景色を設定しています。

この手法を使用することで、ZStackの背景色をカスタマイズできます。

実際に上記のコードを実行すると、画面全体が青色の背景となり、その上に「Hello, ZStack!」というテキストが表示されます。

○サンプルコード8:ZStack内要素のスタイル変更の方法

ZStack内の各要素のスタイルも変更可能です。

ここでは、ZStack内のテキストのフォントや色をカスタマイズする方法を紹介します。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.yellow.edgesIgnoringSafeArea(.all)
            Text("Customized Text")
                .font(.largeTitle)
                .foregroundColor(.white)
                .shadow(radius: 10)
        }
    }
}

このコードでは、ZStack内のテキスト「Customized Text」のフォントをlargeTitleに設定し、文字色を白にしています。

さらに、shadow(radius: 10)を使用してテキストに影を追加しています。

この例では、ZStack内のTextビューをカスタマイズして、フォントのサイズや色、影などのスタイルを変更しています。

このコードを実行すると、黄色の背景上に白い大きなテキストが影付きで表示される結果となります。

○サンプルコード9:ZStackを使って特定の形状を作る方法

ZStackを利用して、特定の形状を持ったビューを作成することもできます。

下記のサンプルコードでは、円形のビューを作成する方法を表しています。

import SwiftUI

struct ContentView: View {
    var body: some View {
        ZStack {
            Circle()
                .fill(Color.green)
                .frame(width: 100, height: 100)
            Text("Inside Circle")
                .foregroundColor(.white)
        }
    }
}

このコードでは、ZStack内でCircle()という形状を使用して、円を作成しています。

fill(Color.green)を使用して、円の色を緑に設定しています。

この例では、ZStackを使用して特定の形状を持ったビューを作成する方法を示しています。

上記のコードを実行すると、緑色の円形のビューの中に「Inside Circle」という白いテキストが表示される結果となります。

●ZStackと他のビューとの組み合わせ

SwiftUIを使用する際、単一のビューだけでなく、複数のビューを組み合わせてインターフェースを構築することがよくあります。

ここでは、ZStackを中心として、他のビューとの組み合わせに焦点を当てて説明します。

○サンプルコード10:ZStackとListの組み合わせ

このコードではZStackとListを組み合わせて使用しています。

Listは項目の一覧を表示する際に非常に役立ちますが、ZStackを使用することで、Listの上に追加の要素を重ねて表示することができます。

この例では、Listの上に半透明のビューを重ねています。

import SwiftUI

struct ZStackWithListView: View {
    var body: some View {
        ZStack {
            List {
                ForEach(0..<10) { item in
                    Text("項目 \(item)")
                }
            }
            // 半透明のビューをListの上に重ねる
            Rectangle()
                .fill(Color.black.opacity(0.5))
                .frame(width: 200, height: 100)
                .cornerRadius(15)
                .overlay(Text("半透明のビュー").foregroundColor(.white))
        }
    }
}

struct ZStackWithListView_Previews: PreviewProvider {
    static var previews: some View {
        ZStackWithListView()
    }
}

このコードでは、Listを使って0から9までの項目を表示しています。

その上には、半透明のRectangleを配置しています。

このRectangleの中には「半透明のビュー」というテキストが含まれており、これによりListの上部に半透明のビューが重ねられていることが視覚的にわかりやすくなっています。

このサンプルを実行すると、Listの上に半透明の四角が表示されることが確認できます。

このように、ZStackを使ってListの上に別のビューを重ねることで、ユーザーインターフェースのデザインの幅が広がります。

まとめ

ZStackはSwiftUIでのUIデザインにおいて非常に強力なツールです。

ビューを重ねることで、複雑なデザインやインターフェースを実現することができます。

本記事では、ZStackの基本的な使用方法から、他のビューとの組み合わせ方法までを詳細に解説しました。

特に、Listとの組み合わせ例では、より高度なUIデザインの一例を紹介しました。

SwiftUIを活用する開発者は、ZStackの特性や使い方を理解し、アプリケーションのUIデザインに活かすことで、ユーザー体験を向上させることができるでしょう。