アニメーションの各フレームをCALayer
にキャプチャして、mp4
ムービーファイルを生成します。CAAnimationのキャプチャ方法
私は以下のコードを書いています。
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.asyc
とCAtransition.begin(), .setCompletionBlock, .commit()
を試しましたが、機能しませんでした。
私は何をしたいのですか?
アニメーションは使用しないでください。その代わりに、タイマーループ(単純なforループ!だけでなく)でアニメーションプロパティを変更してください。レイヤのコンテンツをイメージコンテキストに描画するには、['render(in:)'](https://developer.apple.com/documentation/quartzcore/calayer/1410909-render)を使用します。 – clemens
@macmoonshineあなたの答えをありがとう!しかし私はあなたの方法が私のプロジェクトのためのスイートではないことを恐れています。私のanimationGroupはCAKeyframeAnimationを使用しているので、アニメーション化するには複雑すぎます。 とにかく、ありがとう!ところで、単純なforループがうまくいかないのはなぜですか? –
CAAnimationsはスクリーンプレゼンテーション用に最適化されています。したがって、フレームレートが不均一です。残念ながら、間にレイヤーをレンダリングすると、フレームレートが悪化します。 – clemens