我想捕获CALayer动画的每一帧以生成mp4电影文件。

因此,我在下面编写了代码。

frames是动画中的总帧数,frameTime是1/60秒,并且animationLayer已添加到UIImageView上。

for i in 0...(frames - 1) {

    //add the animation on specified frame to the CALayer
    animationGroup.speed = 0
    animationGroup.timeOffset = frameTime * i
    animationLayer.add(animationGroup, forKey: "morph")

    //capture the frame of the animation.
    UIGraphicsBeginImageContextWithOptions(drawView.bounds.size, true, 0.0)
    drawView.drawHierarchy(in: drawView.bounds, afterScreenUpdates: true)
    uiImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    uiImage = globalFunc.resizeUIImage(uiImage, scale, 400)
    cgImage = uiImage.cgImage!

    //add the captured image to movie file.
    movieCreator.create(image: cgImage)

    animationLayer.removeAnimation(forKey: "moprh")
}


此代码无效。

每帧的图像均不显示,并且创建了电影文件,但是没有动画。

我在上面的代码中尝试了DispatchQueue.main.asycCAtransition.begin(), .setCompletionBlock, .commit(),但是它们没有用。

我应该怎么做才能得到自己想要的东西?

最佳答案

您不应将视图层次结构绘制到图像上下文中。相反,您应该像这样渲染表示层:

if let presentationLayer = drawView.layer.presentation() {
    presentationLayer.render(in: context)
}


表示层表示当前在屏幕上绘制的该层的内容。

关于swift - 如何捕获CAAnimation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47279287/

10-12 06:15