web-dev-qa-db-ja.com

NavigationViewのSwiftUIカスタムアニメーション遷移?

swiftUIで、NavigationView/NavigationLinkの標準の動作を変更する方法はありますか。これは、あるビューから次のビューにスライドすることです。フェードイン/フェードアウトのようなカスタムのアニメーション/トランジションが欲しいのですが。

しばらく試してみて、半分は解決しましたが、後半は苦労しています。このコード:

struct ContentView: View {
    @State var appeared: Double = 0.0

    var body: some View {
        NavigationView {
            VStack {
                Text("\(appeared)")
                NavigationLink(destination: ViewB()) {Text("go to View B")}
            }
            .opacity(appeared)
            .animation(Animation.easeInOut(duration: 3.0), value: appeared)
            .onAppear {self.appeared = 1.0}
            .onDisappear {self.appeared = 0.0}
        }
    }
}

ビューが表示されれば正しく動作します。 3秒以内に不透明度を1.0に変更するとフェードインします。すべて良い。ただし、NavigationLinkをクリックしてビューBに移動すると、このビューがスライドして離れ、ビューB(同じロジックを持つ)がゆっくりとフェードインします。これは、onDisappearが実際にトリガーされるのは、ビューが消えようとしているときではなく、ビューが消えたときだからです。

SwiftUIにスワイプやスライドではなく、カスタムのアニメーション/トランジションを実行するよう指示する可能性はありますか?

Xcode 11.2.1を使用しています

5
jboi

これは少し遅いですが、私はこの問題に遭遇しました、そしておそらく私の解決策はこれを持っている他の誰かを助けるでしょう。

不透明度を変更する必要がありましたが、NavLinkではそれができなかったので、次のようにしました。

struct example: View {
    @State var firstView = true
    @State var appeared: Double = 0
    var body: some View {
        VStack{
            if firstView{
                VStack{
                    Button(action: {
                        self.firstView = false
                    }){
                        Text("change view")
                    }
                }
            }
            else{
                VStack{
                    Text("Hello, World!")
                }
                .opacity(appeared)
                .animation(Animation.easeInOut(duration: 3.0), value: appeared)
                .onAppear {self.appeared = 1.0}
                .onDisappear {self.appeared = 0.0}
            }
        }

    }
}

アイデアは、ボタンが押されたとき(または必要な計算が実行されるときはいつでも)、if-else {}構造を使用して遷移をシミュレートできるということです。

お役に立てば幸いです。

1
Evan