The duration of a transition is used in the animation phase(s) of a transition. This can be the entire length of the transition if the transition is initiated programmatically and there's no interruption / interaction. It can also be after interaction ends, animating towards either end or start (completion or cancellation).
The transition can have one or more animation layers, each with an AnimationRange
, indicating the relative start and end time of a layer to the total duration of the transition.
For example, an AnimationRange(start: 0, end: 0,5)
with a transition duration of 3 seconds will start at 0 seconds and end after 1.5 seconds.
A Transition
's sharedElement
describes how the shared element should move during interaction, but also how it should animate during animation phases. If the sharedElement
is specified, it will have an implicit AnimationRange
of 0 to 1 (the AnimationRange.full
range).
The reason for having an AnimationRange relative to the transition duration is because this duration can be influenced by timing arameters.
Timing parameters describe a timing curve that defines the velocity at which animated properties change to their new values over the duration of the animation. This curve can either be cubic (represented by UICubicTimingParameters
) or follow a spring behavior (represented by UISpringTimingParameters
). On initializing a UIViewPropertyAnimator
, these timing parameters are passed together with the required duration. The property animator will pace the animation by following the timing curve over the length of the duration.
The motion of a spring can be defined either by specifying a dampingRatio
and initialVelocity
, or by exactly specifying the spring's mass
, stiffness
, daming
and initialVelocity
. The former can be configured such that the spring movement settles after the duration. The latter however specifies a fully configured spring system that realistically oscillates according to physics and cannot be influenced to settle at a specific moment. As such it has an implicit duration.
We introduce the AnimationTimingParameters
struct to be able to tell whether the provided timingParameters will have such an implicit duration or not, because from UISpringTimingParameters
it cannot be derived.
Any layer (animation or sharedElement) can have timing parameters that have an implicit duration. The presence thereof will influence the effective duration of the transition.
-
The effective duration is initially expected to be the duration specified in your
Transition
. -
Then, we inspect all animation layers specified in the transition's
animation
. If any layer has an implicit duration that causes that layer to end after the original transition duration, this will extend the effective duration such that the layer ends exactly at the end of the entire transition. -
If there's a
sharedElement
specified, we set its duration to be the effective duration as we know it at this point. However, if thesharedElement
has timing parameters with an implicit duration, that duration will ultimately be the effective duration of the transition.