2016-04-07 88 views
0

我正在使用一個CABasicAnimation,上下反覆縮放CALayer。這意味着動畫是自動反向的,重複無限次,它的關鍵路徑是transform.scale淡出CABasicAnimation

我想要做的是在某個點「淡出」動畫。所以我不想立即停止它(使用layer.removeAnimationForKey:),但我希望動畫在一秒鐘的時間內順利移除。我嘗試在CATransaction區塊中打包layer.removeAnimationForKey:,並設置其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