SwiftUI animerer ændringer i tilstanden. Når en værdi som f.eks. isExpanded ændres inde med Animation(.spring), flyttes hver visning, der afhænger af den, til sit nye layout ved hjælp af en fjeder.
I iOS 17 og nyere er den enkleste måde at beskrive en fjeder med to værdier: varighed, omtrent hvor lang tid det tager at sætte sig, og hoppe, hvor meget den overskrider. Et opspring på 0 giver jævn bevægelse uden overskridelse; højere værdier tilføjer bounce. Apple tilbyder også forudindstillinger: .smooth, .snappy og .bouncy.
Ældre kode bruger .spring(respons:dampingFraction:). Responsen svarer til varigheden, og en dæmpningsbrøkdel på 1 betyder ingen afvisning, mens lavere værdier tilføjer afvisning. Begge former beskriver det samme fysiske forår.
Den store fordel ved fjedre er afbrydelse. Hvis en bruger trykker igen, eller en trækbevægelse slutter midt i animationen, starter den nye fjeder fra den aktuelle position og hastighed, så der er intet spring. For trækbevægelser skal du passere bevægelsens hastighed, når brugeren slipper, så elementet fortsætter i den retning, det blev kastet.
Hvis den samme komponent også skal køre på nettet eller Android, hjælper det at holde fjederværdier som delte bevægelsestokens. ExodeUI, som vi laver, har en SwiftUI runtime, så en designet komponent med dens fjedre kan spille i SwiftUI og på andre platforme.