SwiftUI-动画转换
我在模式表上有一个注销按钮,可以将用户带回登录屏幕。为了实现这一点,我首先关闭该工作表,然后使用asyncAfter(截止日期:)设置一个环境变量,使登录页面出现。一切正常,但一旦工作表被撤销,从工作表下的视图到登录页面的转换就相当不和谐了。主要是因为没有。俯视图消失,显示登录视图。我知道我可以创建自定义转换,但我不知道将其附加到何处。例如,我想淡出图纸下方的视图。(尽管如此,我愿意接受任何形式的过渡!) 这是指导流量的结构:SwiftUI-动画转换,swiftui,transition,Swiftui,Transition,我在模式表上有一个注销按钮,可以将用户带回登录屏幕。为了实现这一点,我首先关闭该工作表,然后使用asyncAfter(截止日期:)设置一个环境变量,使登录页面出现。一切正常,但一旦工作表被撤销,从工作表下的视图到登录页面的转换就相当不和谐了。主要是因为没有。俯视图消失,显示登录视图。我知道我可以创建自定义转换,但我不知道将其附加到何处。例如,我想淡出图纸下方的视图。(尽管如此,我愿意接受任何形式的过渡!) 这是指导流量的结构: struct ConductorView: View { @E
struct ConductorView: View {
@EnvironmentObject var tower: Tower
let onboardingCompleted = UserDefaults.standard.bool(forKey: "FirstVisit")
var body: some View {
VStack {
if tower.currentPage == .onboarding {
Onboarding1View()
} else if tower.currentPage == .login {
LoginView()
} else if tower.currentPage == .idle {
LoginView()
}
}.onAppear{
if self.onboardingCompleted {
self.tower.currentPage = .login
} else {
self.tower.currentPage = .onboarding
}
}
}
}
这是工作表上的注销按钮:
Button(action: {
self.presentationMode.wrappedValue.dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.tower.currentPage = .login
}
}) {
Text("Sign Out")
}
这是一个关于复制代码的简化演示(为了使其可见,我延迟了更长的时间)。当然,您需要根据您的需要调整它,通过改变转换或动画的类型,等等
类塔:可观测对象{
枚举页面类型{
案例载入、登录、空闲
}
@已发布变量currentPage:PageType=.onboarding
}
结构导体视图:视图{
@环境对象var塔:塔
let onboardingCompleted=错误
var body:一些观点{
VStack{
如果tower.currentPage==.Onboard{
Onboarding1View()
}如果tower.currentPage==.login,则为else{
文本(“登录视图”)
.transition(.move(边:。尾部))//
class Tower: ObservableObject {
enum PageType {
case onboarding, login, idle
}
@Published var currentPage: PageType = .onboarding
}
struct ConductorView: View {
@EnvironmentObject var tower: Tower
let onboardingCompleted = false
var body: some View {
VStack {
if tower.currentPage == .onboarding {
Onboarding1View()
} else if tower.currentPage == .login {
Text("LoginView")
.transition(.move(edge: .trailing)) // << here !!
} else if tower.currentPage == .idle {
Text("IdleView")
}
}
.animation(.default, value: tower.currentPage) // << here !!
.onAppear{
if self.onboardingCompleted {
self.tower.currentPage = .login
} else {
self.tower.currentPage = .onboarding
}
}
}
}
struct Onboarding1View: View {
@EnvironmentObject var tower: Tower
@Environment(\.presentationMode) var presentationMode
@State private var isPresented = true
var body: some View {
Text("Login")
.sheet(isPresented: $isPresented) {
Button(action: {
self.presentationMode.wrappedValue.dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.tower.currentPage = .login
}
}) {
Text("Sign Out")
}
}
}
}