2016-06-11 10 views
1

我有CAKeyframeAnimation的大問題。有一個功能可以在用戶選擇後創建選定的動畫。所有數據都在準備的字典中。有一個代碼:CAKeyframeAnimation在導出視頻後沒有動畫

 //Prepare settings 
     let settings = dataManager.getFreeEffectsSettingsForFileName("") 

     //Set origin 
     let freeEffectOrigin = settings.objectForKey("freeEffectOrigin") as! [String: NSNumber] 
     let xOrigin: NSNumber = freeEffectOrigin["x"]! as NSNumber 
     let yOrigin: NSNumber = freeEffectOrigin["y"]! as NSNumber 

     //Set size 
     let freeEffectSize = settings.objectForKey("freeEffectSize") as! [String: NSNumber] 
     let widthSize: NSNumber = freeEffectSize["width"]! as NSNumber 
     let heightSize: NSNumber = freeEffectSize["height"]! as NSNumber 

     //Set frame with origin and size 
     freeEffectAnimationImage = UIImageView(frame: CGRectMake(CGFloat(xOrigin), CGFloat(yOrigin), CGFloat(widthSize), CGFloat(heightSize))) 
     freeEffectAnimationImage.image = dataManager.getFreeEffectsImagesForFileName("")[0] as? UIImage 

     //set begining point 
     let freeEffectBeginingPoint = settings.objectForKey("beginingPoint") as! [String: NSNumber] 
     let xBeginingPoint: NSNumber = freeEffectBeginingPoint["x"]! as NSNumber 
     let yBeginingPoint: NSNumber = freeEffectBeginingPoint["y"]! as NSNumber 

     beginingPoint = CGPointMake(CGFloat(xBeginingPoint), CGFloat(yBeginingPoint)) 

     //set ending point 
     let freeEffectEndingPoint = settings.objectForKey("endingPoint") as! [String: NSNumber] 
     let xEndingPoint: NSNumber = freeEffectEndingPoint["x"]! as NSNumber 
     let yEndingPoint: NSNumber = freeEffectEndingPoint["y"]! as NSNumber 

     endingPoint = CGPointMake(CGFloat(xEndingPoint), CGFloat(yEndingPoint)) 

     freeEffectAnimationImage.center = beginingPoint 

     freeEffectAnimationView.addSubview(freeEffectAnimationImage) 

     let animationCGImagesArray = NSMutableArray() 
     let animationImages = dataManager.getFreeEffectsImagesForFileName("") as! [UIImage] 

     for image: UIImage in animationImages { 
      animationCGImagesArray.addObject(image.CGImage!) 
     } 

     let animation = CAKeyframeAnimation(keyPath: "contents") 
     animation.calculationMode = kCAAnimationDiscrete 
     //animation.beginTime = 0.1 
     animation.duration = 2.5 
     animation.repeatCount = 50 
     //animation.keyTimes = [0.0, 0.4, 0.7, 1.0] 
     animation.autoreverses = false 
     animation.values = animationCGImagesArray as [AnyObject] 
     animation.removedOnCompletion = false 
     animation.fillMode = kCAFillModeForwards 

     freeEffectAnimationImage.layer.addAnimation(animation, forKey: "contents") 

之後,用戶可以保存此動畫,並將其分層的視頻。有一種方法,分層的電影:

VideoSaver.saveVideo(videoAsset!) { 
     (composition, size) in 
     //////////////// 
     //Parent Layer// 
     //////////////// 

     let parentLayer = CALayer() 
     parentLayer.frame = CGRectMake(0, 0, size.width, size.height) 

     /////////////// 
     //Video Layer// 
     /////////////// 
     let videoLayer = CALayer() 
     videoLayer.frame = CGRectMake(0, 0, size.width, size.height) 

     ////////////////////////// 
     //Animation Layout Layer// 
     ////////////////////////// 
     let animationOverlayLayer = AVSynchronizedLayer() 
     animationOverlayLayer.contents = self.freeEffectAnimationImage.image?.CGImage 
     animationOverlayLayer.addAnimation(self.freeEffectAnimationImage.layer.animationForKey("contents")!, forKey: "contents") 
     animationOverlayLayer.frame = CGRectMake(self.beginingPoint.x, self.beginingPoint.y, CGRectGetWidth(self.freeEffectAnimationImage.frame), CGRectGetHeight(self.freeEffectAnimationImage.frame)) 
     animationOverlayLayer.masksToBounds = true 

     /////////////////////////////////////////////// 

     parentLayer.addSublayer(videoLayer) 
     if self.freeEffectAnimationImage.hidden == false { 
      parentLayer.addSublayer(animationOverlayLayer) 
     } 

     /////////////// 
     //Composition// 
     /////////////// 
     composition.animationTool = AVVideoCompositionCoreAnimationTool.init(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer) 
    } 

對不起,長的代碼,但我堅持下去,我必須在星期一完成它。如果有人能幫助我,我會很高興。

回答

6

如果我修好了。問題是因爲我沒有指定beginTime。有一個代碼:

let animation = CAKeyframeAnimation(keyPath: "contents") 
     animation.calculationMode = kCAAnimationDiscrete 
     animation.duration = 2.5 
     animation.repeatCount = 50 
     animation.autoreverses = false 
     animation.values = animationCGImagesArray as [AnyObject] 
     animation.removedOnCompletion = false 
     animation.fillMode = kCAFillModeForwards 
     animation.beginTime = AVCoreAnimationBeginTimeAtZero 

     freeEffectAnimationImage.layer.addAnimation(animation, forKey: "contents") 
+1

冠軍。謝謝 - 這讓我很難過。 – MikeNatty

+1

謝謝!我有同樣的問題,這是因爲我也錯過了beginTime。 – Cooliopas

+0

你永遠猜不到!添加beginTime爲我解決了這個問題。謝謝! – crgt

相關問題