Цель:

  • Первая анимация запускается в течение 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.

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

0
RanLearns 18 Апр 2019 в 04:32

2 ответа

Лучший ответ

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

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

0
RanLearns 18 Апр 2019 в 19:09

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

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()
        }
    }
}

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

0
matt 18 Апр 2019 в 16:31