【发布时间】:2021-04-07 01:11:47
【问题描述】:
我希望能够根据状态转换使用不同的转换。例如,如果我从 .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
}
}
}
}
}
【问题讨论】:
-
你能显示该州的代码吗?
-
我添加了一个完整的示例,说明了所需(但不工作)的行为。
-
这是否回答了您的问题stackoverflow.com/questions/61340717/…?
-
这是一个非常好的问题。据我了解,在创建视图时将转换定义为视图,因此在创建视图后更改转换实际上会触发旧视图的
removal转换(这是在将其更改为之前定义的转换)褪色或移动)因此无法更新视图的转换属性,直到下一次删除。我也对可行的解决方案感到好奇。
标签: ios swift swiftui swiftui-animation