12.4 如何创建显式动画

如果将动画修改器附加到视图,最终会是一个隐式动画。隐式动画就是我们并没有指定任何动画的类型。我们仅仅改变了一些属性,然后系统来决定如何并且何时去实现动画。

而显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。我们可以使用 withAnimation() 修改器来让 SwiftUI 进行精确的动画设定。

例如,使用显式动画来让按钮逐渐消失:

struct ContentView: View {
    @State var opacity: Double = 1

    var body: some View {
        Button(action: {
            withAnimation {
                self.opacity -= 0.2
            }
        }) {
            Text("Tap here")
                .padding()
                .opacity(opacity)
        }
    }
}

withAnimation() 接受一个所需动画类型的参数,因此可以创建一个 3 秒钟的基本动画,如下所示:

withAnimation(.basic(duration: 3)) {
    self.opacity -= 0.2
}

显式动画通常很有用,他们它会使每个受影响的视图都出现动画,而不仅仅是哪些附加了隐式动画的动画。例如,如果视图 A 必须为视图 B 的动画腾出空间,但是只有视图 B 有动画效果,那么就必须使用显示动画,不然视图 A 会直接无动画地跳到新的位置。