SwiftUI:将动画附加到过渡效果

5
根据苹果文档,我们应该能够直接将动画附加到转换中。例如:
.transition(AnyTransition.slide.animation(.linear))

方法的文档:

extension AnyTransition {

    /// Attach an animation to this transition.
    public func animation(_ animation: Animation?) -> AnyTransition
}

说:

摘要

将动画附加到此转换。

但我无法使其正常工作。看一下这个最小化可行的示例(您可以复制粘贴它并自行尝试):

import SwiftUI

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(AnyTransition.slide.animation(.linear))
            } else {
                Color.yellow
                    .transition(AnyTransition.slide.animation(.linear))
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
    }
}

struct AnimationTest_Previews: PreviewProvider {
    static var previews: some View {
        AnimationTest()
    }
}

您可以看到根本没有任何动画效果。有什么想法吗?谢谢。


我也遇到了这个问题,并提交了一个错误报告。在Xcode 12 / iOS 14中似乎仍然无法正常工作。 - Mark Moeykens
1个回答

2

您需要在withAnimation()闭包中包装布尔切换:

withAnimation {
    self.show.toggle()
}

我在模拟器上测试了在Xcode 11.2.1中的过渡效果;画布无法预览。

请注意,直接应用于视图的动画/过渡会影响该特定视图及其子级。此外,根据文档:

func animation(Animation?) -> View

将给定的动画应用于视图中的所有可动画值。

由于可动画值(在这种情况下是启用过渡的布尔开关)是外部的,不属于颜色视图,因此必须从按钮操作中显式地对其进行动画处理。或者,可以有效地直接将过渡附加到目标视图,但将动画应用于它们的容器,从而使show的更改插值变化成为可能。因此,这也实现了所需的结果:

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(.slide)
            } else {
                Color.yellow
                    .transition(.slide)
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
        .animation(.linear)
    }
}

嗨,感谢您的回答。我知道使用显式动画可以解决问题。但是这里的问题是,根据苹果文档,动画可以直接附加到转换上。但出于某些原因,至少在上面的示例中,它们在某些情况下似乎无法正常工作,我正在尝试理解为什么。 - superpuccio
在完成了有关 SwiftUI 布局系统的最新技术项目并重新阅读动画文档后,我对这种情况有了一些理解。请查看我的更新答案。 - Xtian D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接