es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 estado value.

    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:

    struct TestView: View {
        @State private var value = 5.0
        private var newValue: Double {
            value + 3
        }
    
        var body: some View {
            List {
                Slider(
                    value: $value,
                    in: 0...10
                ) {
                } minimumValueLabel: {
                    Text("0")
                } maximumValueLabel: {
                    Text("10")
                }
                Button("Button") {
                    withAnimation(.easeInOut(duration: 10)) {
                        value = newValue
                    }
                }
            }
        }
    }
    

    En este código actualizado, hemos agregado una nueva propiedad calculada llamada newValue que calcula el valor actualizado de value. Dentro del bloque de animación, ahora estamos estableciendo value con el valor calculado de newValue, lo cual debería activar la animación como se esperaba.

    Prueba esto y avísame si ayuda a resolver el problema.

Comments are closed.