CoreAnimation - Слой мерцает до конечного значения перед началом анимации? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь сделать простую CABasicAnimation цвета фона слоя от красного до синего.

После добавления анимации и установки окончательного значения слоя модели анимация мигает синим цветом, а затем снова становится красным и анимируется синим.

Мой код:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // Create red layer and add to view
    let redLayer = CALayer()
    redLayer.backgroundColor = UIColor.red.cgColor
    redLayer.position = view.center
    redLayer.bounds.size = CGSize(width: 100, height: 100)
    view.layer.addSublayer(redLayer)

    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {

        // After a 1 second delay, animate from red to blue.

        let anim = CABasicAnimation(keyPath: "backgroundColor")
        anim.duration = 3
        anim.fromValue = redLayer.backgroundColor
        anim.toValue = UIColor.blue.cgColor
        redLayer.add(anim, forKey: "")

        // Set background color to final value
        redLayer.backgroundColor = UIColor.blue.cgColor
    }
}

Что здесь происходит?

enter image description here

1 Ответ

0 голосов
/ 02 ноября 2018

Краткий ответ: вы получаете неявную анимацию, когда обновляете неявно анимируемое свойство слоя (backgroundColor в этом случае).

Эта 0,25-секундная анимация имеет приоритет над вашей явной анимацией, потому что она добавляется впоследствии. Эта неявная анимация происходит из-за того, что слой является «автономным» (т. Е. Он не принадлежит представлению).

Чтобы избавиться от этой неявной анимации, вы можете создать CATransaction и отключить действия только для области, которая обновляет свойство слоя:

CATransaction.begin()
CATransaction.setDisableActions(true)

redLayer.backgroundColor = UIColor.blue.cgColor

CATransaction.commit()

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

...