Dze*_*mix 1 video objective-c calayer ios swift
我对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")
Run Code Online (Sandbox Code Playgroud)
之后,用户可以保存此动画并将其分层放在视频上.有一种方法可以分层电影:
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)
    }
Run Code Online (Sandbox Code Playgroud)
很抱歉长代码,但我坚持下去,我必须在星期一完成它.如果有人能帮助我,我会很高兴.
呃,我修好了.问题是因为我没有指定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")
Run Code Online (Sandbox Code Playgroud)