12.2 使用弹簧动画

除了基本动画,SwiftUI 也支持弹簧动画(spring animation),弹簧动画有一定类似阻尼的效果,移动到目标点的时候,会稍微超过,然后反弹回来。

举个例子,创建一个文本视图,每次点击旋转 45 度,把 .basic() 换成 .spring(),如果没有额外参数,那么它会自动设定一个合理的默认值。

struct ContentView: View {
    @State var angle: Double = 0

    var body: some View {
        Button(action: {
            self.angle += 45
        }) {
            Text("Tap here")
                .padding()
                .rotationEffect(.degrees(angle))
                .animation(.spring())
        }
    }
}

如果要手动设定 .spring() 动画效果,可设定的参数有 mass、stiffness、damping 和 initialVelocity。

例如,我们创建一个弹簧阻尼非常低的按钮,它会在达到目标角度之前进行长时间的反弹,如下:

Button(action: {
    self.angle += 45
}) {
    Text("Tap here")
        .padding()
        .rotationEffect(.degrees(angle))
        .animation(.spring(mass: 1, stiffness: 1, damping: 0.1, initialVelocity: 10))
}