SwiftUI анімує зміни стану. Коли таке значення, як isExpanded, змінюється всередині withAnimation(.spring), кожен перегляд, який залежить від нього, переміщується до свого нового макета за допомогою пружини.
В iOS 17 і пізніших версіях найпростіший спосіб описати пружину – це два значення: тривалість, приблизно скільки часу потрібно, щоб осісти, і відскок, наскільки вона перевищує. Відскік 0 дає плавний рух без викидів; вищі значення додають відскок. Apple також надає пресети: .smooth, .nappy і .bouncy.
Старіший код використовує .spring(response:dampingFraction:). Відповідь подібна до тривалості, і демпфіруюча частка 1 означає відсутність відскоку, тоді як менші значення додають відскок. Обидві форми описують ту саму фізичну пружину.
Великою перевагою пружин є переривання. Якщо користувач торкається ще раз або жест перетягування завершує анімацію, нова пружина починається з поточної позиції та швидкості, тому стрибка не відбувається. Для жестів перетягування передайте швидкість жесту, коли користувач відпускає, щоб елемент продовжував рух у напрямку, у якому його кинули.
Якщо той самий компонент також потрібно запускати в Інтернеті або на Android, допоможе зберегти пружинні значення як спільні маркери руху. ExodeUI, який ми робимо, має середовище виконання SwiftUI, тому один розроблений компонент із його пружинами може працювати в SwiftUI та на інших платформах.