Я работаю над зацикленной анимацией, которую можно отменить при желании. Когда анимация отменяется, вызывается другая анимация, чтобы анимировать уровень представления обратно к значению fromValue предыдущей анимации.
Зацикленная анимация:
var toBounds = layer.bounds
toBounds.size.height = 12
let animation = CABasicAnimation(keyPath: "bounds")
animation.fromValue = layer.bounds
animation.toValue = toBounds
animation.repeatCount = HUGE
animation.autoreverses = true
animation.duration = 0.3
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
layer.removeAllAnimations()
layer.add(animation, forKey: "oscillation")
Анимация отмены:
if let presentationLayer = layer.presentation() {
let animation = CABasicAnimation(keyPath: "bounds")
animation.fromValue = presentationLayer.bounds
animation.toValue = layer.bounds
animation.duration = 0.3
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
layer.removeAllAnimations()
layer.add(animation, forKey: "decay")
}
Это делает анимацию плавной при возвращении в исходное состояние. Однако, когда анимация перезапускается, когда анимация отмены все еще занята, анимация имеет этот эффект заикания. Что я пытался сделать, так это изменить значение fromValue в зацикленной анимации, но это означает, что анимация не возвращается к желаемому значению fromValue. Как я могу снова сделать этот перезапуск плавным? Есть ли способ установить текущее значение анимации?
CAAnimation
иCALayer
. С помощьюbeginTime
иtimeOffset
вы можете изменить начальную точку анимации. - person clemens   schedule 08.02.2018