Transition
A description of view changes to apply when a view is added to and removed from the view hierarchy.
Declaration
@MainActor @preconcurrency protocol TransitionOverview
A transition should generally be made by applying one or more modifiers to the content. For symmetric transitions, the isIdentity property on phase can be used to change the properties of modifiers. For asymmetric transitions, the phase itself can be used to change those properties. Transitions should not use any identity-affecting changes like .id, if, and switch on the content, since doing so would reset the state of the view they’re applied to, causing wasted work and potentially surprising behavior when it appears and disappears.
The following code defines a transition that can be used to change the opacity and rotation when a view appears and disappears.
struct RotatingFadeTransition: Transition {
func body(content: Content, phase: TransitionPhase) -> some View {
content
.opacity(phase.isIdentity ? 1.0 : 0.0)
.rotationEffect(phase.rotation)
}
}
extension TransitionPhase {
fileprivate var rotation: Angle {
switch self {
case .willAppear: return .degrees(30)
case .identity: return .zero
case .didDisappear: return .degrees(-30)
}
}
}A type conforming to this protocol inherits @preconcurrency @MainActor isolation from the protocol if the conformance is included in the type’s base declaration:
struct MyCustomType: Transition {
// `@preconcurrency @MainActor` isolation by default
}Isolation to the main actor is the default, but it’s not required. Declare the conformance in an extension to opt out of main actor isolation:
extension MyCustomType: Transition {
// `nonisolated` by default
}See Also:
TransitionPhaseSee Also:
AnyTransition
Topics
Getting built-in transitions
blurReplaceblurReplace(_:)identitymove(edge:)offset(_:)offset(x:y:)opacitypush(from:)scalescale(_:anchor:)slidesymbolEffectsymbolEffect(_:options:)
Configuring a transition
Using a transition
Creating a custom transition
Supporting types
See Also
Defining transitions
transition(_:)TransitionPropertiesTransitionPhaseAsymmetricTransitionAnyTransitioncontentTransition(_:)contentTransitioncontentTransitionAddsDrawingGroupContentTransitionPlaceholderContentViewnavigationTransition(_:)NavigationTransitionmatchedTransitionSource(id:in:)matchedTransitionSource(id:in:configuration:)MatchedTransitionSourceConfiguration