CABasicAnimation — продолжить анимацию со слоя представления, но не со значения

Я работаю над зацикленной анимацией, которую можно отменить при желании. Когда анимация отменяется, вызывается другая анимация, чтобы анимировать уровень представления обратно к значению 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. Как я могу снова сделать этот перезапуск плавным? Есть ли способ установить текущее значение анимации?


person evenwerk    schedule 08.02.2018    source источник
comment
Это уже встроено в обе анимации.   -  person evenwerk    schedule 08.02.2018
comment
@TimE: я не знаю полного решения, но вам следует поискать CAMediaTiming протокол, который реализован CAAnimation и CALayer. С помощью beginTime и timeOffset вы можете изменить начальную точку анимации.   -  person clemens    schedule 08.02.2018
comment
Это может помочь: stackoverflow.com/questions/2306870/ и stackoverflow.com/questions/7568567/   -  person Sharad Chauhan    schedule 08.02.2018