将多个带有动画的 CATextLayer 添加到 CALayer 无法正常工作
Adding multiple CATextLayers with animations to CALayer not working properly
我通过使用 CATextLayer()
加上 CAKeyframeAnimation()
改变不透明度来为每一行文本制作动画,从而将一些自定义字幕刻录到视频中。
我正在努力检测为什么有时有些行没有出现。大多数时候只是没有出现的第一行(似乎是随机的)。
这是我刻录一行字幕的函数:
let textLayer = CATextLayer()
textLayer.string = createNSStringFromWords(string: subtitles.lineText, textSize: size)
textLayer.shouldRasterize = true
textLayer.rasterizationScale = UIScreen.main.scale
textLayer.backgroundColor = UIColor.clear.cgColor
textLayer.alignmentMode = .center
textLayer.frame = CGRect(
x: 0,
y: videoSize.height * 0.11,
width: videoSize.width,
height: 200)
textLayer.displayIfNeeded()
textLayer.opacity = 0
// MARK: - Text animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.beginTime = subtitles.startTime
opacityAnimation.duration = (subtitles.endTime - subtitles.startTime)
// Opacity animation style
opacityAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
opacityAnimation.values = [0.2, 1, 1, 1, 1]
opacityAnimation.keyTimes = [0, 0.2, 0.5, 0.8, 1]
opacityAnimation.autoreverses = false
// What happens when we end the animation
opacityAnimation.fillMode = .removed
opacityAnimation.isRemovedOnCompletion = false
// Add the final result and iterate
textLayer.add(opacityAnimation, forKey: "opacity")
targetLayer.addSublayer(textLayer)
我运行这是为每一行文本添加的,每行添加到相同的CALayer
(textLayer)。我检查了输入字幕,时间和文本似乎都是正确的。动画我也看了,好像没问题。
第一个和其余之间的唯一区别似乎是初始开始 (0) 和持续时间(通常 > 1.0 秒)。不确定下一步要去哪里。
您所说的“初始开始 (0)”令人怀疑。您没有显示足够的代码,但是您的动画开始时间以 AVCoreAnimationBeginTimeAtZero 的形式表示是至关重要的,我没有看到任何证据表明您正在这样做。您不能使用 0,因为它将被替换为 CACurrentMediaTime()
.
我通过使用 CATextLayer()
加上 CAKeyframeAnimation()
改变不透明度来为每一行文本制作动画,从而将一些自定义字幕刻录到视频中。
我正在努力检测为什么有时有些行没有出现。大多数时候只是没有出现的第一行(似乎是随机的)。
这是我刻录一行字幕的函数:
let textLayer = CATextLayer()
textLayer.string = createNSStringFromWords(string: subtitles.lineText, textSize: size)
textLayer.shouldRasterize = true
textLayer.rasterizationScale = UIScreen.main.scale
textLayer.backgroundColor = UIColor.clear.cgColor
textLayer.alignmentMode = .center
textLayer.frame = CGRect(
x: 0,
y: videoSize.height * 0.11,
width: videoSize.width,
height: 200)
textLayer.displayIfNeeded()
textLayer.opacity = 0
// MARK: - Text animation
let opacityAnimation = CAKeyframeAnimation(keyPath: "opacity")
opacityAnimation.beginTime = subtitles.startTime
opacityAnimation.duration = (subtitles.endTime - subtitles.startTime)
// Opacity animation style
opacityAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
opacityAnimation.values = [0.2, 1, 1, 1, 1]
opacityAnimation.keyTimes = [0, 0.2, 0.5, 0.8, 1]
opacityAnimation.autoreverses = false
// What happens when we end the animation
opacityAnimation.fillMode = .removed
opacityAnimation.isRemovedOnCompletion = false
// Add the final result and iterate
textLayer.add(opacityAnimation, forKey: "opacity")
targetLayer.addSublayer(textLayer)
我运行这是为每一行文本添加的,每行添加到相同的CALayer
(textLayer)。我检查了输入字幕,时间和文本似乎都是正确的。动画我也看了,好像没问题。
第一个和其余之间的唯一区别似乎是初始开始 (0) 和持续时间(通常 > 1.0 秒)。不确定下一步要去哪里。
您所说的“初始开始 (0)”令人怀疑。您没有显示足够的代码,但是您的动画开始时间以 AVCoreAnimationBeginTimeAtZero 的形式表示是至关重要的,我没有看到任何证据表明您正在这样做。您不能使用 0,因为它将被替换为 CACurrentMediaTime()
.