~~Screen Transition~~

Back to Top

links




アプリ概要

今回は画面遷移だけ行うアプリを作成しました。
簡単な画面遷移は「ToDoリスト」で行いましたが、普及しているアプリが行なっているような かっこいい画面遷移を導入したいと思い、アプリ作成に取り組みました。

機能紹介

画面遷移の学習のため作成したアプリなので、その他の機能はありません。
下の画像が、アプリ起動直後の画面となります。

表示されているボタンを押すと、下からぬるっとViewが表示されます。

表示されたViewの中には、前の画面に戻るためのボタンが表示されます。
ボタンの指示通り、前の画面に戻るためにはボタンを押下するほかにも、下にスワイプすることでも 前の画面に戻ることができます。

コード(全体)

以下がコードの全体像になります。

/ContentView


import SwiftUI

struct ContentView: View {
    
    @State private var isShowingView: Bool = false

    var body: some View {
        Button {
            isShowingView.toggle()
        } label: {
            Text("下からぬるっと表示")
        }
        .sheet(isPresented: $isShowingView) {
            SecondView()
        }
    }
}

struct SecondView: View {
    
    @Environment(\.dismiss) var dismiss

    var body: some View {
        Button(action:{
            dismiss()
        }){
            Text("押下または、下スワイプで戻る")
        }
    }
}

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

コード解説

今回の画面遷移の学習にあたって、この記事を参考にしました。 ほとんど記事のコードを書き写すだけで、実現できました。

どこが下からぬるっと遷移させているのか

下からぬるっと表示させているのは、13行目の.sheetの機能です。


.sheet(isPresented: $isShowingView) {
    SecondView()
}

このように表示したいViewを中に入れてあげることで、指定したViewを下からぬるっと表示することができます。
また、isPresentedの引数に「$isShowingView」と言った値を渡しています。この変数は、5行目で@Stateとして宣言した Bool型の変数になります。今回の場合のように変数名の前にダラーマーク($)をつけることを、バインディングと言います。 バインディングの主な機能としては、その変数を監視し、変数の変更やそれによる処理の変更などを行なってくれます。 私自身の解釈では、変数の変化による処理の変化の保証といった感じです。
この引数にtrueが渡された場合は下からぬるっと表示し、falseが渡された場合は元の画面に戻ります。

アノテーション

今回初めてみたアノテーションがありました。それは22行目に登場した、@Environmentです。


@Environment(\.dismiss) var dismiss

このアノテーションは、()内で指定した環境・状態を取得できるようにするものです。 今回の例では、dismissを取得しています。このdismissとは、実行することで表示している プレゼンを閉じることができます。これによりボタンを押下することで、別の構造体であるContentView内の isShowingView変数を変更してくれます。おそらく、.sheetの引数がバインディングされていないといけない 理由は、ここにあるのかもしれないですね。

まとめ

今回は画面遷移をよりカッコ良くするために学習を行いました。取り組む前は、 長いプログラムや複雑な構造が必要なのかと身構えていましたが、実際に取り組んでみると 短いコードで、簡単に行うことができたので驚きました。また、今回初めて学習した アノテーションや.sheetにつては、自分なりに解釈してみましたが、実際の挙動とは少し 異なるのではないのかなとも思っています。今回の学習で、より実践に近い画面遷移ができるようになったので 実際に取り入れたアプリを次回は作成したいと思います。

《参考文献》
SwiftUIで画面遷移を実装する
https://qiita.com/tty_0/items/cecbc6dccaf31db65cb8

@EnvironmentでViewの環境値を読み取ろう-SwiftUI
https://x.gd/LXms5