SwiftUI anime les changements d’état. Lorsqu'une valeur telle que isExpanded change à l'intérieur de withAnimation(.spring), chaque vue qui en dépend se déplace vers sa nouvelle disposition à l'aide d'un ressort.
Dans iOS 17 et versions ultérieures, la manière la plus simple de décrire un ressort consiste à utiliser deux valeurs : la durée, à peu près le temps qu'il faut pour se stabiliser, et le rebond, le degré de dépassement. Un rebond de 0 donne un mouvement fluide sans dépassement ; des valeurs plus élevées ajoutent du rebond. Apple propose également des préréglages : .smooth, .snappy et .bouncy.
Le code plus ancien utilise .spring(response:dampingFraction:). La réponse est similaire à la durée, et une fraction d'amortissement de 1 signifie aucun rebond tandis que des valeurs inférieures ajoutent un rebond. Les deux formes décrivent le même ressort physique.
Le gros avantage des ressorts est l’interruption. Si un utilisateur appuie à nouveau ou qu'un geste de glissement met fin à l'animation, le nouveau ressort démarre à partir de la position et de la vitesse actuelles, il n'y a donc pas de saut. Pour les gestes de glissement, transmettez la vitesse du geste lorsque l'utilisateur relâche, afin que l'élément continue dans la direction dans laquelle il a été lancé.
Si le même composant doit également s'exécuter sur le Web ou sur Android, il est utile de conserver les valeurs Spring en tant que jetons de mouvement partagés. ExodeUI, que nous fabriquons, a un runtime SwiftUI, donc un composant conçu avec ses ressorts peut jouer dans SwiftUI et sur d'autres plates-formes.