在ForEach堆栈中的SwiftUI按钮上停止动画

时间:2019-12-21 01:59:08

标签: swift swiftui ios-animations

概述

我正在使用#100daysofswiftui来学习SwiftUI,我正在32天学习。它是一个简单的标志游戏,包含我所在国家/地区的名称,并随机选择了正确的答案

@State private var paises = ["Poland", "Russia", "Spain", "UK", "US"].shuffled()
@State private var respuestaCorrecta = Int.random(in: 0...2)

然后我用forEach制作按钮

ForEach(0 ..< 3){ numero in
    //right answer
    if numero == self.respuestaCorrecta {
        Button(action:{
            self.BanderaSeleccionada(numero)
        }){
            Bandera(imagen: self.paises[numero])
        }    .rotation3DEffect(.degrees(self.GoodAnimationAmount),
                               axis: (x: 0, y: 1, z: 0))
    } else {
        Button(action:{
            self.BanderaSeleccionada(numero)
        }){
            Bandera(imagen: self.paises[numero])
        } 
    }
}

如果用户选择了右键,我会这样做:

func BanderaSeleccionada(_ numero: Int)  {
    if numero == respuestaCorrecta{
        tituloPuntaje = "Respuesta correcta"
        textoPuntaje = "¡Bien Hecho!"
        self.puntaje += 1

        self.GoodAnimationAmount += 360
        withAnimation(.interpolatingSpring(stiffness: 5, damping: 1)) {
                             self.GoodAnimationAmount += 360
        }


        withAnimation {
                       self.TheOthersAnimationAmount -= 0.75
                   }


    }else{
        withAnimation{ 
            self.WrongAnimationAmount += 4
        }

        tituloPuntaje = "Respuesta incorrecta"
        textoPuntaje = "Has elegido \(paises[numero])"
    }

    mostrarPuntuajeMasAlto = true
}

做出正确的答案

问题

问题在于值的变化,如果下一个右按钮与最后一个按钮相同,则标志继续旋转,因此破坏了正确答案,当正确答案是另一个动画时,动画就消失了,所以我有点对Swift的工作方式感到困惑。

我现在能做的最好的事情就是删除.interpolatingSpring(stiffness: 2, damping: 1),但是当国家洗牌时,我想停止插补Spring。

func hacerPregunta() {
    self.GoodAnimationAmount = 0
    self.WrongAnimationAmount = 0
    self.TheOthersAnimationAmount = 1.0

    respuestaCorrecta = Int.random(in: 0...2)
    paises.shuffle()   
}

example of the bug

1 个答案:

答案 0 :(得分:1)

跳到下一个问题时,应更新正确的答案 respuestaCorrecta = -1 ,而不是像这样的随机 respuestaCorrecta = Int.random(in:0 ... 2)