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)
}
對不起,長的代碼,但我堅持下去,我必須在星期一完成它。如果有人能幫助我,我會很高興。
冠軍。謝謝 - 這讓我很難過。 – MikeNatty
謝謝!我有同樣的問題,這是因爲我也錯過了beginTime。 – Cooliopas
你永遠猜不到!添加beginTime爲我解決了這個問題。謝謝! – crgt