2016-06-11 11 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

相关问题