samedi 11 juin 2016

CAKeyframeAnimation doesn't animate after exporting video


I have big problem with CAKeyframeAnimation. There is a function that create selected animation after selected it by the user. All data is in the prepared dictionary. There is a code:

        //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")

After that user can save this animation and layer it on the video. There is a method that layering the movie:

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)
    }

Sorry for the long code but I stuck on it and I must finish it on the Monday. If somebody could help me I will be glad.


Aucun commentaire:

Enregistrer un commentaire