SwiftUI Navigation Transitions – can do push and pop animation
  • June 25, 2025

SwiftUINavigationTransitions is a library that integrates seamlessly with SwiftUI’s NavigationView and NavigationStack, allowing complete customization over push and pop transitions!

Overview


Instead of reinventing the entire navigation stack just to control its transitions, this library ships with a simple modifier that can be applied directly to SwiftUI’s very own first-party navigation components.

The Basics

iOS 13+

NavigationView {
// …
}
.navigationViewStyle(.stack)
.navigationTransition(.slide)

iOS 16+

NavigationStack {
// …
}
.navigationTransition(.slide)

The API is designed to resemble that of built-in SwiftUI Transitions for maximum familiarity and ease of use.

You can apply custom animations just like with standard SwiftUI transitions:

.navigationTransition(
.fade(.in).animation(.easeInOut(duration: 0.3))
)

You can combine them:

.navigationTransition(
.slide.combined(with: .fade(.in))
)

And you can dynamically choose between transitions based on logic:

.navigationTransition(
reduceMotion ? .fade(.in).animation(.linear) : .slide(.vertical)
)

Transitions

The library ships with some standard transitions out of the box:

  • default
  • fade(_:)
  • slide(axis:)

In addition to these, you can create fully custom transitions in just a few lines of SwiftUI-like code!

struct Swing: NavigationTransitionProtocol {
var body: some NavigationTransitionProtocol {
Slide(axis: .horizontal)
MirrorPush {
let angle = 70.0
let offset = 150.0
OnInsertion {
ZPosition(1)
Rotate(.degrees(-angle))
Offset(x: offset)
Opacity()
Scale(0.5)
}
OnRemoval {
Rotate(.degrees(angle))
Offset(x: -offset)
}
}
}
}

struct Swing: NavigationTransitionProtocol {
var body: some NavigationTransitionProtocol {
Slide(axis: .horizontal)
MirrorPush {
let angle = 70.0
let offset = 150.0
OnInsertion {
ZPosition(1)
Rotate(.degrees(-angle))
Offset(x: offset)
Opacity()
Scale(0.5)
}
OnRemoval {
Rotate(.degrees(angle))
Offset(x: -offset)
}
}
}
}

.navigationTransition(.slide, interactivity: .pan) // full-pan screen gestures!

This even works to override its behavior while maintaining the default system transition in iOS:

.navigationTransition(.default, interactivity: .pan) // ✨

Installation


Add the package via Swift Package Manager:

dependencies: [
.package(url: “https://github.com/davdroman/swiftui-navigation-transitions”, from: “0.15.0”),
]

.product(name: “SwiftUINavigationTransitions”, package: “swiftui-navigation-transitions”),

GitHub


View Github

#animation #native #navigation
YOU MIGHT ALSO LIKE...
🧭 NavigationKit

NavigationKit is a lightweight library which makes SwiftUI navigation super easy to use. 💻 Installation 📦 Swift Package Manager Using Swift Package Manager, add ...

swiftui-navigation-stack

An alternative SwiftUI NavigationView implementing classic stack-based navigation giving also some more control on animations and programmatic navigation. NavigationStack Installation ...

Stinsen

Simple, powerful and elegant implementation of the Coordinator pattern in SwiftUI. Stinsen is written using 100% SwiftUI which makes it ...

SwiftUI Router

With SwiftUI Router you can power your SwiftUI app with path-based routing. By utilizing a path-based system, navigation in your app becomes ...

FlowStacks

This package takes SwiftUI's familiar and powerful NavigationStack API and gives it superpowers, allowing you to use the same API not just ...