Исчезновение CABasicAnimation

Я использую CABasicAnimation, который многократно масштабирует CALayer вверх и вниз. Это означает, что анимация является автореверсивной, повторяется бесконечное количество раз, а ее ключевой путь — transform.scale.

Что я хочу сделать, так это «исчезнуть» анимацию в определенный момент. Поэтому я не хочу останавливать ее немедленно (с помощью layer.removeAnimationForKey:), но я хочу, чтобы анимация плавно удалялась за промежуток времени, скажем, в одну секунду. Я попытался обернуть layer.removeAnimationForKey: в блок CATransaction и установить его animationDuration, но это тоже не сработало.

Любая помощь приветствуется.


person return true    schedule 07.04.2016    source источник


Ответы (1)


Вот пример затухания, которое вызывается, когда заканчивается видео, которое я воспроизводил с помощью AVPlayer.

override func viewWillAppear(animated: Bool) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.finishedPlaying(_:)), name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
}

var fadeOut:CABasicAnimation!

func finishedPlaying(myNotification:NSNotification) {

    self.commsRightNow = commsMode.appleTV.rawValue
    fadeOut = CABasicAnimation(keyPath: "opacity")
    fadeOut.fromValue = 1.0
    fadeOut.toValue = 0.0
    fadeOut.duration = 8.0
    fadeOut.delegate = self
    fadeOut.setValue("video", forKey:"fadeOut")
    fadeOut.removedOnCompletion = false
    fadeOut.fillMode = kCAFillModeForwards
    playerLayer.addAnimation(fadeOut, forKey: nil)
}

Вы также можете вызвать приведенный ниже метод, чтобы выполнить дополнительные действия после завершения анимации. Этот полностью удаляет объект AVPlayer. Обратите внимание, что ключи fadeOut и video являются определяемыми пользователем значениями и включены, поскольку у вас может быть несколько запускаемых (и останавливающихся) анимаций, которые вам необходимо идентифицировать.

override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    let nameValue = anim.valueForKey("fadeOut") as? String
    if let name = nameValue {
        if (name == "video") {
            playerLayer?.removeFromSuperlayer()


        }
    }

Вы также можете вызвать это, чтобы оно срабатывало при запуске анимации.

override func animationDidStart(anim: CAAnimation) {
    // Blah Blah
}
person user3069232    schedule 08.04.2016
comment
Спасибо. Но я не думаю, что этот ответ достигает того, чего я хочу. Я не хочу, чтобы слой исчез; Я хочу, чтобы сама анимация исчезла. Моя анимация многократно меняет масштаб преобразования от 1 до 1,5 и наоборот. Я хочу, чтобы этот эффект плавно исчезал, чтобы в конце шкала была равна 1 (по умолчанию). - person return true; 08.04.2016