SwiftUI 条件视图不会 animate/transition

SwiftUI conditional view will not animate/transition

我正在尝试使用 .transition() 来获得 animate/transition 的观看次数。我使用 中的类似代码并将 .transition() 放入两个条件视图。

struct Base: View {
    @State private var isSignedIn = false

    var body: some View {
        Group {
            if(isSignedIn){
                Home().transition(.slide)
            }else{
                AuthSignin(isSignedIn: self.$isSignedIn).transition(.slide)
            }
        }
    }
}

struct AuthSignin: View {
    @Binding var isSignedIn: Bool

    var body: some View {
        VStack {
            Button(action: {
                self.isSignedIn = true
            }) {
                Text("Sign In")
                    .bold()
                    .frame(minWidth: CGFloat(0), maxWidth: .infinity)
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(Color.white)
                    .cornerRadius(CGFloat(10))
            }.padding()
        }
    }
}

但是,每当我点击 "Sign In" 按钮(有或没有 .transition())时,应用程序会冻结一秒钟,然后 Home() 视图会突然出现,没有任何animation/transition。我也试过将 self.isSignedIn = true 包装在 withAnimation 中,但它仍然不起作用。有什么想法或有更好的方法吗?

放 WithAnimation before self.isSignedIn = true

将您的 .transition 放在 将切换的视图容器 上,而不是每个条件视图。这是我完成的一些代码中的一个简单示例(有效)。

在需要条件过渡的主View中:

import SwiftUI

struct AppWrapperView: View {

  @State var showFirstRun:Bool = true

  var body: some View {
    ZStack {
      if (showFirstRun) {
        FirstRunView(showFirstRun: $showFirstRun)
      } else {
        Text("Some other view")
      }
    }
    .transition(.slide)
  }
}

然后,触发条件更改的视图中的某处:

import SwiftUI

struct FirstRunView: View {

  @Binding var showFirstRun:Bool

  var body: some View {

    Button(action: {
      withAnimation {
        self.showFirstRun = false
      }
    }) {
      Text("Done")
    }
  }
}

我不得不将我的 if..else 语句放在 ZStack 容器而不是 Group 中。在我的案例中,似乎 Group 是动画损坏的主要原因。此外,我将 .transition.animation 结合应用于容器而不是视图。

ZStack {
  if(isSignedIn){
    Home()
  } else {
    AuthSignin(isSignedIn: self.$isSignedIn)
  }
}
.transition(.slide)
.animation(.easeInOut)