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)
我正在尝试使用 .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)