ios - 如何在Swift中的BezierPath之后为imageView的点1到2和点2到3设置不同的animation.duration时间?
问题描述
我有一个带有 BezierPath 的 UIView 子视图和一个遵循从 a 到 b 的路径的 ImageView。路径有 8 个点,我需要点 1 到点 2 具有与点 2 到点 3 等不同的持续时间
我已经能够设置视图和路径并沿路径为图像设置动画,但完整动画的持续时间相同。这是我的动画代码,任何帮助将不胜感激。
let pathToFollow = path
let animation = CAKeyframeAnimation(keyPath: #keyPath(CALayer.position))
animation.path = pathToFollow?.cgPath
animation.duration = 10.0
animation.calculationMode = kCAAnimationPaced
animation.delegate = self
self.icons[Icon].layer.add(animation, forKey: nil)
解决方案
你有一个关键帧动画,这是一个好的开始。但是你忘了添加一些实际的帧!为此,请提供一些keyTimes
. (并删除kCAAnimationPaced
; 这意味着整个动画有一个单一的速度,这与你所说的你想要的相反。)
请注意,对于这种路径动画,帧分割点是用于定义路径的贝塞尔点,因此一切都取决于路径最初是如何构建的。
这是一个实际的例子:
当我们绕着广场前进时,观察我们如何在每个角落加速。角是控制点所在的位置。这是我使用的代码:
let path = CGPath(rect: CGRect(x: 120, y: 120, width: 100, height: 100),
transform: nil)
let anim = CAKeyframeAnimation(keyPath: #keyPath(CALayer.position))
anim.duration = 10
anim.path = path
anim.calculationMode = .linear
anim.keyTimes = [0.0, 0.7, 0.9, 0.98, 1.0]
self.v.layer.add(anim, forKey: nil)
推荐阅读
- python - 如何在python中以递增的顺序将NAT中缺少的日期替换为某个日期
- postgresql - 如何在 PostgreSQL 中使用 $and
- python-3.x - 带有用户输入 (input()) 的 Python if 语句不起作用(Python 3.7)
- logstash - logstash 多管道决策器
- javascript - 使用 ID/Class 创建常用的 keydown 函数
- excel - 在其他计算机上插入数据粘贴错误
- serial-port - UART 转 RS-232 协议
- javascript - Vee 验证在 vue 设置后获取先前的值
- html - Outlook HTML - 没有自动空间的签名编辑
- python - 如何在 TensorFlow 中将信号与一维内核卷积?