Animation 有没有更好的方法在swiftui中实现抖动动画?

Animation 有没有更好的方法在swiftui中实现抖动动画?,animation,button,swiftui,Animation,Button,Swiftui,当用户尝试登录时,我试图让一个按钮在没有填写所有文本字段的情况下晃动,这就是我到目前为止遇到的情况: struct Shake: GeometryEffect { var amount: CGFloat = 10 var shakesPerUnit = 3 var animatableData: CGFloat func effectValue(size: CGSize) -> ProjectionTransform { Projectio

当用户尝试登录时,我试图让一个按钮在没有填写所有文本字段的情况下晃动,这就是我到目前为止遇到的情况:

struct Shake: GeometryEffect {
    var amount: CGFloat = 10
    var shakesPerUnit = 3
    var animatableData: CGFloat

    func effectValue(size: CGSize) -> ProjectionTransform {
        ProjectionTransform(CGAffineTransform(translationX:
            amount * sin(animatableData * .pi * CGFloat(shakesPerUnit)),
            y: 0))
    }
}

struct Correct: View {
    @State var attempts: Int = 0

    var body: some View {
        VStack {
            Rectangle()
                .fill(Color.pink)
                .frame(width: 200, height: 100)
                .modifier(Shake(animatableData: CGFloat(attempts)))
            Spacer()
            Button(action: {
                withAnimation(.default) {
                    self.attempts += 1
                }

            }, label: { Text("Login") })
        }
    }
}
然而,这对于按钮来说是特别无用的,即使这样,动画看起来也非常不好,因为它非常机器人化。有人能给我一个改进建议,让我的按钮可以摇动吗?

试试这个

struct ContentView: View {
    @State var selected = false

    var body: some View {
        VStack {
            Button(action: {
                self.selected.toggle()
            }) { selected ? Text("Deselect") : Text("Select") }
            Rectangle()
                .fill(Color.purple)
                .frame(width: 200, height: 200)
                .offset(x: selected ? -30 : 0)
                .animation(Animation.default.repeatCount(5).speed(6))
        }
    }
}

这很好,但在动画完成时不会重置
矩形()
偏移量。可以在此处找到这样一个示例: