如何在条件视图上为视图转换设置动画?

How to animate a view transition on a conditional view?

设置非常简单:

必须满足以下条件:

一些后果:


我准备了下面的例子:

struct Test: View {
    @State private var S1: Bool = false
    @State private var S2: Bool = false
    
    func VX(_ text: String, color: Color = .red) -> some View {
        Text(text).padding(10).background(color).padding(10)
    }
    
    var transition: AnyTransition {
        .move(edge: .top).combined(with: .opacity)
    }
    
    var body: some View {
        VStack {
        
            if S1 {
                VX("V1")
                    .transition(transition)
                    .animation(.easeOut, value: S1) // <--- not working
            }
            
            VX("V2", color: S2 ? .red : .blue)
                .offset(x: S1 ? 30 : 0)
            
            Spacer()
            
            HStack {
                Button(action: changeS1) {
                    Text("Change S1")
                }
                
                Button(action: changeS2) {
                    Text("Change S2")
                }
            }
        }
    }
    
    func changeS1() {
        S1.toggle()
    }
    
    func changeS2() {
        S2.toggle()
    }
}

我认为他们实现动画的方式不起作用,因为视图是由同一个变量有条件地插入的,因此在值 (S1) 发生变化时不存在,因此 .animation(.., value: S1) 无法检测到任何变化,因此不会出现动画。

所以问题是:如何根据同时确定其条件存在的变量为视图的转换设置动画?

感谢任何想法 - 谢谢!

.animation 修饰符应该应用于拥有条件视图的容器,因此它可以动画化 appear/disapper 过渡,例如

    VStack {
    
        if S1 {
            VX("V1")
                .transition(transition)
        }
       // ... other code
    }
    .animation(.easeOut, value: S1) // < here !!