我希望能够根据状态转换使用不同的转换。例如,如果我从.one => .three出发,我想在删除时淡出ViewOne。如果我从.one => .two出发,我想在移除时将ViewOne移到左边。现在,我有这样的东西(显然,它只适用于.one => .two的转换):
ZStack {
if state == .one {
ViewOne()
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
}
if state == .two {
ViewTwo()
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
}
if state == .three {
ViewThree()
.transition(.asymmetric(insertion: .opacity, removal: .identity))
}
}如何根据状态动态地更改转换?
更新:这里有一个更完整的示例:
enum Screen {
case susi, onboarding, home
}
struct ContentView: View {
@State var screen: Screen = .susi
@State var transition: AnyTransition = .asymmetric(insertion: .identity, removal: .move(edge: .leading))
var body: some View {
ZStack {
if screen == .susi {
ViewOne()
.transition(transition)
}
if screen == .onboarding {
ViewTwo()
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
}
if screen == .home {
ViewThree()
.transition(.asymmetric(insertion: .opacity, removal: .identity))
}
}
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
withAnimation(.default) {
self.transition = .asymmetric(insertion: .identity, removal: .opacity)
self.screen = .home
}
}
}
}
}发布于 2021-04-07 22:22:05
对于那些用同样的问题阅读这篇文章的人,一种解决方案是切换视图的id属性。一些搜索,所以引导我使用这种技术,这显然是重置动画为一个视图。
import SwiftUI
enum Screen {
case susi, onboarding, home
}
struct ContentView: View {
@State var screen: Screen = .susi
@State var transition: AnyTransition = .move(edge: .leading)
@State var viewId = UUID().uuidString
var body: some View {
ZStack {
if screen == .susi {
ViewOne()
.transition(transition)
}
if screen == .onboarding {
ViewTwo()
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .trailing)))
}
if screen == .home {
ViewThree()
.transition(.asymmetric(insertion: .opacity, removal: .move(edge: .bottom)))
}
}
.id(viewId)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
withAnimation(.default) {
self.screen = .onboarding
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
withAnimation(.default) {
self.screen = .susi
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.transition = .opacity
self.viewId = UUID().uuidString
withAnimation(.default) {
self.screen = .home
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.transition = .move(edge: .top)
self.viewId = UUID().uuidString
withAnimation(.default) {
self.screen = .susi
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
self.transition = .move(edge: .leading)
self.viewId = UUID().uuidString
withAnimation(.default) {
self.screen = .onboarding
}
}
}
}
}
}
}
}
}最后,我修改了id of ViewOne,而不是整个ZStack,因为我担心这样做会产生一些意想不到的SwiftUI怪癖。同样的技术,只是把它应用到不同的视图中。
https://stackoverflow.com/questions/66978328
复制相似问题