Skip to main content
LanguageРусский
Инженерное дело5 минут чтенияоктябрь 2026 г.

Как работает пружинная анимация в SwiftUI?

Краткий ответ

В SwiftUI вы добавляете пружину с помощью .animation(.spring) или withAnimation(.spring). Начиная с iOS 17, основными настройками являются продолжительность и отскок, а также есть пресеты: .smooth (без отскока), .snappy (немного) и .bouncy (больше). Старый код использует ответ и DampingFraction. Пружины SwiftUI сохраняют свою скорость, когда новая анимация прерывает их, что делает жесты более естественными.

Главное

  • Используйте withAnimation(.spring) для изменения состояния или .animation(.spring, value:) в представлении.
  • iOS 17+: .spring(duration:bounce:) плюс пресеты .smooth, .snappy и .bouncy.
  • Старый API: .spring(response:dampingFraction:blendDuration:)
  • Springs — это стиль анимации SwiftUI по умолчанию, начиная с iOS 17.
  • Прерывистые пружины сохраняют свою скорость, поэтому жесты выполняются плавно.

SwiftUI анимирует изменения состояния. Когда значение, такое как isExpanded, изменяется внутри withAnimation(.spring), каждое зависимое от него представление перемещается в новый макет с помощью пружины.

В iOS 17 и более поздних версиях самый простой способ описать пружину — это использовать два значения: продолжительность, примерно сколько времени требуется для стабилизации, и отскок, насколько она выходит за пределы. Отскок, равный 0, обеспечивает плавное движение без перерегулирования; более высокие значения добавляют отскок. Apple также предоставляет пресеты: .smooth, .snappy и .bouncy.

В более старом коде используется .spring(response:dampingFraction:). Отклик аналогичен длительности: доля затухания, равная 1, означает отсутствие отскока, тогда как более низкие значения добавляют отскок. Обе формы описывают одну и ту же физическую пружину.

Большим преимуществом пружин является прерывание. Если пользователь снова коснется или жест перетаскивания завершится в середине анимации, новая пружина начнется с текущей позиции и скорости, поэтому скачок не произойдет. Для жестов перетаскивания передайте скорость жеста, когда пользователь отпускает его, чтобы элемент продолжал двигаться в том же направлении, в котором он был брошен.

Если тот же компонент также необходимо запустить в Интернете или на Android, полезно сохранить значения Spring в качестве общих токенов движения. ExodeUI, который мы делаем, имеет среду выполнения SwiftUI, поэтому один разработанный компонент с его пружинами может работать в SwiftUI и на других платформах.

Частые вопросы

Какая анимация по умолчанию в SwiftUI?

Начиная с iOS 17, анимация по умолчанию — плавная пружина.

В чем разница между .snappy и .bouncy?

.snappy быстро стабилизируется с небольшим превышением; .bouncy больше выходит за рамки. .smooth не имеет перерегулирования.

Как преобразовать отклик и DampingFraction в продолжительность и отскок?

Ответ примерно соответствует продолжительности. Доля демпфирования, равная 1, соответствует отскоку 0; более низкие доли демпфирования означают больший отскок.

Как добавить скорость с помощью жеста перетаскивания?

Считайте скорость, когда перетаскивание заканчивается, и используйте интерполирующую пружину или более новые API-интерфейсы пружины, которые принимают начальную скорость.

Связанные руководства и примеры

Настройте пружину, прежде чем писать код

Перетаскивайте ползунки, наблюдайте за движением и копируйте значения пружин для SwiftUI, CSS и других платформ.

Откройте пружинный генератор
ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Try for free in your browser →