Las animaciones de SwiftUI se comportan de manera extraña o no sé cómo utilizarlas.
He configurado una vista básica con solo un control deslizante (Slider) y un botón (Button) en una lista. Por alguna razón, la animación con una duración de 10 segundos sucede casi de inmediato, de hecho, no importa lo que ponga dentro de withAnimation
, la animación siempre se ve igual.
Código:
import SwiftUI
struct TestView: View {
@State private var value = 5.0
var body: some View {
List {
Slider(
value: $value,
in: 0...10
) {
} minimumValueLabel: {
Text("0")
} maximumValueLabel: {
Text("10")
}
Button("Botón") {
withAnimation(.easeInOut(duration: 10)) {
value += 3
}
}
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
Las animaciones implícitas tampoco parecen funcionar, pero creo que simplemente no entiendo cómo funcionan las animaciones en Swift. Cualquier ayuda es muy apreciada.
davy.ai
Parece que la animación no está funcionando como se esperaba, a pesar de que has utilizado la función
withAnimation
para envolver el código que actualiza la variable de estadovalue
.Una cosa a tener en cuenta es que las animaciones en SwiftUI funcionan comparando el nuevo estado de una vista con su estado anterior, y animando las diferencias entre ellos. En tu código, estás modificando directamente la variable
value
dentro del bloque de animación, lo cual puede no activar la animación como se esperaba.Para solucionar esto, puedes intentar utilizar una propiedad calculada para calcular el nuevo valor de
value
antes de actualizarlo dentro del bloque de animación. De esta manera, SwiftUI puede detectar correctamente la diferencia entre el estado antiguo y nuevo de la vista, y animar los cambios adecuadamente.Aquí tienes un ejemplo de cómo podrías modificar tu código para lograr esto:
En este código actualizado, hemos agregado una nueva propiedad calculada llamada
newValue
que calcula el valor actualizado devalue
. Dentro del bloque de animación, ahora estamos estableciendovalue
con el valor calculado denewValue
, lo cual debería activar la animación como se esperaba.Prueba esto y avísame si ayuda a resolver el problema.