SwiftUI анимирует изменения состояния. Когда значение, такое как isExpanded, изменяется внутри withAnimation(.spring), каждое зависимое от него представление перемещается в новый макет с помощью пружины.
В iOS 17 и более поздних версиях самый простой способ описать пружину — это использовать два значения: продолжительность, примерно сколько времени требуется для стабилизации, и отскок, насколько она выходит за пределы. Отскок, равный 0, обеспечивает плавное движение без перерегулирования; более высокие значения добавляют отскок. Apple также предоставляет пресеты: .smooth, .snappy и .bouncy.
В более старом коде используется .spring(response:dampingFraction:). Отклик аналогичен длительности: доля затухания, равная 1, означает отсутствие отскока, тогда как более низкие значения добавляют отскок. Обе формы описывают одну и ту же физическую пружину.
Большим преимуществом пружин является прерывание. Если пользователь снова коснется или жест перетаскивания завершится в середине анимации, новая пружина начнется с текущей позиции и скорости, поэтому скачок не произойдет. Для жестов перетаскивания передайте скорость жеста, когда пользователь отпускает его, чтобы элемент продолжал двигаться в том же направлении, в котором он был брошен.
Если тот же компонент также необходимо запустить в Интернете или на Android, полезно сохранить значения Spring в качестве общих токенов движения. ExodeUI, который мы делаем, имеет среду выполнения SwiftUI, поэтому один разработанный компонент с его пружинами может работать в SwiftUI и на других платформах.