2016-04-07 2 views
0

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

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

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

ответ

0

Вот пример исчезновения, который вызывается, когда видео, которое я воспроизвожу с завершением 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 и видео являются определяемыми пользователем значениями и включаются, поскольку вы можете запустить несколько анимаций (&), которые необходимо идентифицировать.

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 
} 
+0

спасибо. Но я не думаю, что этот ответ достигает того, чего я хочу. Я не хочу, чтобы слой исчезал; Я хочу, чтобы сама анимация исчезла. Моя анимация изменяет масштаб преобразования несколько раз от 1 до 1,5 и наоборот. Я хочу, чтобы этот эффект был постепенно погас, так что в конце шкала 1 (по умолчанию). –

+0

Возможно, это может помочь, если вы разместили свой код? – user3069232