TransitionTween
| Discussion thread | Status |
|---|---|
TransitionTween plan |
Accepted on November 1, 2016 |
TransitionTween describes tween animations that occur during a transition between two states.
Note that this motion family can/should compose to
TweenorKeyframeTween.
Contract
Plan TransitionTween {
var property
var backValue
var foreValue
var forwardTimingFunction
var backwardTimingFunction
var segment: TransitionSegment
var window: TransitionWindow
}
property is any animatable value on the target object.
back is the destination value when the direction is backward.
fore is the destination value when the direction is forward.
forwardTimingFunction is the timing function to use when initially animating forward.
backwardTimingFunction is the timing function to use when initially animating backward.
forwardSegment is the portion of the transition window in which the animation should occur during a forward transition.
backwardSegment is the portion of the transition window in which the animation should occur during a backward transition.
window is the transition window within which the segment applies.
Example: Fade transition
TransitionDirector Fade {
func setUp() {
let fade = TransitionTween("opacity",
window: window,
segment: .init(position: 0, length: 1)
back: 0,
fore: 1)
addPlan(fadeIn, to: forwardElement)
}
}
Example: Slide transition
TransitionDirector Slide {
func setUp() {
let shiftUp = TransitionTween("position",
window: window,
segment: .init(position: 0, length: 1)
back: bottomEdge,
fore: topEdge)
addPlan(shiftUp, to: forwardElement)
}
}
Plan considerations
Provide convenience APIs for describing both back- and foreward segments with one call. For example:
transitionTween.segment = .init(position: 0, length: 0.5)
would initialize forwardSegment as the first half and backwardSegment as the last half.
Performer considerations
A TransitionTweenPerformer will generate different tweens based on the initial direction. Consider the following examples:
window = TransitionWindow(duration: 0.4s)
TransitionTween("opacity",
window: window,
segment: .init(position: 0, length: 0.25)
back: 0,
fore: 1)
When initial direction == forward:
let forwardTween = Tween("opacity", duration: 0.1s)
forwardTween.from = 0
forwardTween.to = 1
When initial direction == backward:
let backwardTween = Tween("opacity", duration: 0.1s)
backwardTween.delay = 0.3s
backwardTween.from = 1
backwardTween.to = 0