Swift: последовательные анимации CABasic, которые повторяются - PullRequest
0 голосов
/ 18 апреля 2019

Цель:

  • Первая анимация запускается в течение 1,0
  • При 1,0 запускается вторая анимация (в то время как первая анимация автоматически возвращается к своей начальной точке)
  • В 2.0 первая анимация возвращается в начальную точку, вторая анимация завершена, и первая анимация повторяется
  • В 3.0 вторая анимация запускается, когда первая анимация завершает свой второй запуск

Мой код:

let animation = CABasicAnimation(keyPath: "transform.scale")
        animation.fromValue = 1.0
        animation.toValue = 1.5
        animation.duration = 1.0
        animation.autoreverses = true
        animation.repeatCount = .greatestFiniteMagnitude
        image1.layer.add(animation, forKey: animation.keyPath)

        let animation2 = CABasicAnimation(keyPath: "transform.scale")
        animation2.fromValue = 1.0
        animation2.toValue = 2.0
        animation2.duration = 1.0
        animation2.fillMode = .forwards

        let animation2b = CABasicAnimation(keyPath: "opacity")
        animation2b.fromValue = 1.0
        animation2b.toValue = 0.0
        animation2b.duration = 1.0
        animation2b.fillMode = .forwards

        let animationGroup = CAAnimationGroup()
        animationGroup.animations = [animation2, animation2b]
        animationGroup.duration = 2.0
        animationGroup.beginTime = 1.0
        animationGroup.repeatCount = .greatestFiniteMagnitude
        image2.layer.add(animationGroup, forKey: "scaleAndFade")

Цель - запустить 2-ю анимацию 1.0 после 1-й анимации.А поскольку группа анимации имеет длительность 2,0, а анимации внутри нее - только 1,0, анимация начинается с 1,0, заканчивается с 2,0, а затем не повторяется до 3,0

Иногда две анимациисоответствовать, но не на каждой сборке.Есть ли более надежный способ начать вторую анимацию, чтобы начать точно в конце первой законченной анимации начальной анимации?Так что они будут синхронизированы с этого момента.Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Мне нравится ответ @ matt и я всегда ценю их ввод, но так как я пытался использовать CAAnimation (в частности, я хотел использовать CAKeyframeAnimation), я закончил тем, что вложил две транзакции CAT, используя CATransaction.begin() и CATransaction.setCompletionBlock, чтобы запустить одну анимацию точно вконец другого и затем рекурсивный вызов функции несколько раз.

CATransaction документация

0 голосов
/ 18 апреля 2019

Мне немного неясно, чего мы пытаемся достичь, но я чувствую, что идея в том, что у нас есть два представления с повторяющимися анимациями, которые необходимо координировать.Чтобы продемонстрировать пример того, как это можно сделать, я решил сделать обе анимации масштабированными с последующим уменьшением:

enter image description here

Анимированный GIF здесь заканчивается после нескольких повторений, но на самом деле повторение продолжается вечно.

Это было просто достигнуто следующим образом:

func step1() {
    UIView.animate(withDuration: 1, animations: {
        self.v1.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
        self.v2.transform = .identity
    }) { _ in
        DispatchQueue.main.async {
            self.step2()
        }
    }
}

func step2() {
    UIView.animate(withDuration: 1, animations: {
        self.v1.transform = .identity
        self.v2.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    }) { _ in
        DispatchQueue.main.async {
            self.step1()
        }
    }
}

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

...