Contents

AnimationStateKey

A key for accessing animation state values.

Declaration

protocol AnimationStateKey

Overview

To access animation state from an AnimationContext in a custom animation, create an AnimationStateKey. For example, the following code creates an animation state key named PausableState and sets the value for the required defaultValue property. The code also defines properties for state values that the custom animation needs when calculating animation values. Keeping the state values in the animation state key makes it more convenient to read and write those values in the implementation of a CustomAnimation.

private struct PausableState<Value: VectorArithmetic>: AnimationStateKey {
    var paused = false
    var pauseTime: TimeInterval = 0.0

    static var defaultValue: Self { .init() }
}

To make accessing the value of the animation state key more convenient, define a property for it by extending AnimationContext:

extension AnimationContext {
    fileprivate var pausableState: PausableState<Value> {
        get { state[PausableState<Value>.self] }
        set { state[PausableState<Value>.self] = newValue }
    }
}

Then, you can read and write your state in an instance of CustomAnimation using the AnimationContext:

struct PausableAnimation: CustomAnimation {
    let base: Animation

    func animate<V>(value: V, time: TimeInterval, context: inout AnimationContext<V>) -> V? where V : VectorArithmetic {
        let paused = context.environment.animationPaused

        let pausableState = context.pausableState
        var pauseTime = pausableState.pauseTime
        if pausableState.paused != paused {
            pauseTime = time - pauseTime
            context.pausableState = PausableState(paused: paused, pauseTime: pauseTime)
        }

        let effectiveTime = paused ? pauseTime : time - pauseTime
        let result = base.animate(value: value, time: effectiveTime, context: &context)
        return result
    }
}

Topics

Setting the default value

See Also

Creating custom animations