SwiftUI anima los cambios de estado. Cuando un valor como isExpanded cambia dentro de withAnimation(.spring), cada vista que depende de él se mueve a su nuevo diseño usando un resorte.
En iOS 17 y versiones posteriores, la forma más sencilla de describir un resorte es con dos valores: duración, aproximadamente cuánto tiempo tarda en asentarse, y rebote, cuánto se sobrepasa. Un rebote de 0 proporciona un movimiento suave sin sobrepasos; los valores más altos añaden rebote. Apple también proporciona ajustes preestablecidos: .smooth, .snappy y .bouncy.
El código anterior usa .spring(response:dampingFraction:). La respuesta es similar a la duración, y una fracción de amortiguación de 1 significa que no hay rebote, mientras que los valores más bajos añaden rebote. Ambas formas describen el mismo resorte físico.
La gran ventaja de los resortes es la interrupción. Si un usuario vuelve a tocar o un gesto de arrastre finaliza en mitad de la animación, el nuevo resorte comienza desde la posición y velocidad actuales, por lo que no hay salto. Para los gestos de arrastre, pase la velocidad del gesto cuando el usuario lo suelta, de modo que el elemento continúe en la dirección en la que fue lanzado.
Si el mismo componente también necesita ejecutarse en la web o en Android, es útil mantener los valores de Spring como tokens de movimiento compartidos. ExodeUI, que fabricamos, tiene un tiempo de ejecución SwiftUI, por lo que un componente diseñado con sus resortes puede funcionar en SwiftUI y en otras plataformas.