我想为 CAShapeLayer
的路径设置动画。但是,此路径是使用许多弧创建的。弧的数量在路径的开始和结束值中是相同的。然而,由于弧的长度不同,这似乎意味着实际路径使用不同数量的贝塞尔曲线控制点。这意味着动画不可预测且非常有问题*。
到目前为止,我的解决方案是创建一个 CAKeyFrameAnimation
,并放入大量关键帧。它仅适用于每秒非常多的关键帧。 (大约 200 到 300)。再低一点,就会出现故障*。
这种方法非常粗糙,因为它的成功取决于实际设备上的实际帧速率,并创建比动画实际需要更多的关键帧实例,从而浪费内存。 所以我的问题是:有没有办法创建一个动画,我必须以某种方式创建每个值?我正在想象一些基于委托(delegate)的方法,在这种方法中,系统会根据关键时间向我询问一个值。我不知道解决我的问题的最佳方法是什么。
*注意:我所说的故障是仅在一帧中出现的看起来很奇怪的路径。
最佳答案
您应该尝试使用 CADisplayLink
这是一个例子:
func setupAnimation() {
let dispLink = CADisplayLink(target: self, selector: #selector(updateAnimation))
dispLink.preferredFramesPerSecond = 60 //will update 60 times per second (the default for iOS devices) ... this line of code is optional depending on the fps you want for your animation
dispLink.add(to: RunLoop.current, forMode: RunLoop.Mode.common)
}
func updateAnimation() {
//do your animation code here
}
使用显示链接会将你的动画链接到屏幕的刷新率,这样它就很流畅,你基本上可以做任何你想做的事情而不会看起来很不稳定
关于ios - 我如何创建一个 iOS CAAnimation 并自己定义每个插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54137527/