CABasicAnimation动画(搜索)到整个时间轴上的某个位置

时间:2015-03-31 15:50:32

标签: ios

我想知道CoreAnimation是否可以使用以下内容。

就像标题所说的那样,我想在整个时间轴动画中及时制作动画或寻找动画。

例如,假设我创建了一个CABasicAnimation,它使用EaseOut的缓动函数在整个10秒的时间轴上将CALayer的颜色从蓝色激活为红色。

我不是从头到尾播放动画,而是更喜欢更精细的控制。

例如,我想说整个动画的animateTo(50%)。这将导致动画从0%开始,并通过缓出功能动画到整个动画的50%。因此,动画将持续5秒,我们将处于颜色转换的中间。

在此之后,我可以说,animateTo(20%)。这将导致动画从我们当前的50%位置开始,并以相反的动画制作动画总动画的20%。所以我们最终得到了3秒的动画,我们的颜色从蓝色变为红色的20%。

最后,我们只是在整个时间轴上动画到一个位置。我可以很容易地说animateTo(5秒)而不是animateTo(50%)。或者animateTo(2秒)而不是animateTo(20%)。

我一直在阅读CoreAnimation,看来我无法获得这种控制权。有没有其他人尝试使用CoreAnimation?

谢谢!

2 个答案:

答案 0 :(得分:1)

最新的SDK为UIKit动画添加了一些内容。 它可能适合您的需求......

根据文件:

  

新的基于对象,完全互动且可中断的动画支持,可让您保持对动画的控制并使用基于手势的交互将其链接

新的闪亮UIViewPropertyAnimator

let animator = UIViewPropertyAnimator(duration: 3.0, curve: .easeInOut) {
    self.myView.alpha = 0
}
animator.startAnimation()

animator.pauseAnimation()
animator.isReversed = true
animator.fractionComplete = 1.5 / CGFloat(animator.duration)

但是有一些限制: PropertyAnimator要求定位 iOS 10 (截至撰写本文时仍处于测试阶段)。 此外,动画仅限于UIView 动画属性,它们是:

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch

如果您寻求更多灵活性和功能,请查看一些开源库,例如TRXAdvance

import TRX

let tween = Tween(from: 0, to: 1, time:3, ease:Ease.Quad.easeOut) {
    anyObject.anyProperty = $0
}
let reversed = tween.reversed()
reversed.seek(1.5)
reversed.start()

答案 1 :(得分:0)

正如已经指出的那样,没有内置功能。但是如果你想创建自己的解决方案,这里有一些已经存在的注释和有用的功能。

CABasicAnimation符合`CAMediaTiming'协议,并为您的用例包含一些简洁的功能:

  • timeOffset - 此值确定您实际想要开始动画的时间,如果您的动画持续时间为2秒且timeOffset设置为1,则会导致动画在中间。
  • speed - 将该值设置为-1会导致动画反转(例如,对于50%到20%的情况)
  • duration - 如果您想要更改动画的持续时间以进行较短的更改,则可能会更改,例如形成40%至50%。
  • timingFunction - 我希望可以在这里提供自定义计时功能,例如,即使持续时间设置为5秒,也只需在1秒后完成动画,这意味着:线性功能0到1之间,之后只是常数。但是,也可以使用bezierPath实现近似值。