Я на самом деле создал фреймворк, чтобы сделать это специально, вы можете запускать анимации относительно хода времени или значения интерполяции прогресса. Фреймворк и документацию можно найти здесь:
https://github.com/AntonTheDev/FlightAnimator
В следующих примерах предполагается, что вы поддерживаете вид CATextLayer, так как здесь нет вопроса о том, как его настроить, вот небольшой пример для начала:
class CircleProgressView: UIView {
.....
override class func layerClass() -> AnyClass {
return CircleProgressLayer.self
}
}
Пример 1:
Предполагая, что у вас есть вид с поддержкой CATextLayer, мы можем анимировать цвет его переднего плана следующим образом и запустить другую анимацию относительно времени:
var midPointColor = UIColor.orange.cgColor
var finalColor = UIColor.orange.cgColor
var keyPath = "foregroundColor"
textView.animate { [unowned self] (a) in
a.value(midPointColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
// This will trigger the interruption
// at 0.5 seconds into the animation
animator.triggerOnProgress(0.5, onView: self.textView, animator: { (a) in
a.value(finalColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
})
}
Пример 2:
Так же, как и в предыдущем примере, когда у вас есть представление с поддержкой CATextLayer, мы можем анимировать его foregroundColor относительно матрицы прогресса значений RBG, рассчитанной на основе величины прогресса 3 значений:
var midPointColor = UIColor.orange.cgColor
var finalColor = UIColor.orange.cgColor
var keyPath = "foregroundColor"
textView.animate { [unowned self] (a) in
a.value(midPointColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
// This will trigger the interruption
// when the magnitude of the starting point
// is equal to 0.5 relative to the final point
a.triggerOnValueProgress(0.5, onView: self.textView, animator: { (a) in
a.value(finalColor, forKeyPath : keyPath).duration(1.0).easing(.OutCubic)
})
}
Надеюсь, это поможет:)