Цепная анимация в SwiftUI - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над относительно сложной анимацией в SwiftUI и задаюсь вопросом, какой самый лучший / самый элегантный способ связать различные фазы анимации.

Допустим, у меня есть представление, которое сначала нужно масштабировать, затемподождите несколько секунд, а затем исчезнет (а затем подождите пару секунд и начните сначала - на неопределенный срок).

Если я попытаюсь использовать несколько блоков withAnimation () в одном представлении / стеке, они в конечном итоге будут мешатьдруг с другом и испортить анимацию.

Лучшее, что я мог придумать, это вызвать пользовательскую функцию в модификаторе .onAppear () начальных представлений и в этой функции иметь блоки withAnimation () для каждогоэтап анимации с задержками между ними.В общем, это выглядит примерно так:

func doAnimations() {
  withAnimation(...)

  DispatchQueue.main.asyncAfter(...)
    withAnimation(...)

  DispatchQueue.main.asyncAfter(...)
    withAnimation(...)

  ...

}

В итоге получается довольно долго и не очень "красиво".Я уверен, что должен быть лучший / более хороший способ сделать это, но все, что я до сих пор пробовал, не дало мне точный поток, который я хочу.

Любые идеи / рекомендации / советы будут высоко оценены,Спасибо!

1 Ответ

0 голосов
/ 05 июля 2019

Боюсь, на данный момент нет поддержки таких ключевых кадров.По крайней мере, они могли бы добавить onAnimationEnd() ... но такой вещи нет.

Там, где мне удалось немного повезти, это анимация контуров формы.Хотя ключевых кадров нет, у вас больше контроля, так как вы можете определить свои «AnimatableData».Например, проверьте мой ответ на другой вопрос: https://stackoverflow.com/a/56885066/7786555

В этом случае это в основном дуга, которая вращается, но увеличивается от нуля до некоторой длины, и в конце разворота она постепенно идетвернуться к нулевой длине.Анимация имеет 3 фазы: сначала один конец дуги движется, а другой - нет.Затем они оба движутся вместе с одинаковой скоростью, и, наконец, второй конец достигает первого.Мой первый подход состоял в том, чтобы использовать идею DispatchQueue, и она работала, но я согласен: это ужасно безобразно.Затем я понимаю, как правильно использовать AnimatableData.Так что ... если вы оживляете пути, вам повезло.В противном случае, похоже, нам придется дождаться возможности более элегантного кода.

...