Swift 向CALayer添加多个带有动画的CatextLayer无法正常工作

Swift 向CALayer添加多个带有动画的CatextLayer无法正常工作,swift,uikit,avfoundation,Swift,Uikit,Avfoundation,我正在通过使用CATextLayer()plusCAKeyframeAnimation()和不透明度的更改,将一些自定义字幕刻录到视频中 我很难发现为什么有时候有些线条没有出现。大多数情况下,只是第一行没有出现(似乎是随机的) 下面是我烧录一行字幕的功能: let textLayer = CATextLayer() textLayer.string = createNSStringFromWords(string: subtitles.lineText, textSize: size) text

我正在通过使用
CATextLayer()
plus
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)”是可疑的。您没有显示足够的代码,但动画开始时间必须用avcoreAnimationBeginTimesZero表示,这一点非常重要,我看不到有任何证据表明您正在这样做。您不能使用0,因为它将被替换为
CACurrentMediaTime()

您所说的“初始启动(0)”是可疑的。您没有显示足够的代码,但动画开始时间必须用avcoreAnimationBeginTimesZero表示,这一点非常重要,我看不到有任何证据表明您正在这样做。您不能使用0,因为它将被替换为
CACurrentMediaTime()

事实上,我这次传递了一个Double。非常感谢@matt,这正是导致问题的原因。你能提供更多关于动画的参考资料吗?非常感谢事实上,我这次通过了一个替补。非常感谢@matt,这正是造成问题的原因。你能提供更多关于动画的参考资料吗?非常感谢