In SwiftUI we use NavigationView
and NavigationLink
views to perform navigations (what we used to call segue
in UIKit
). The standard segue in UIKit is the show
segue. In SwiftUI we can simply do:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination")) {
Text("Navigate!")
}
}
}
}
}
to have the exact same effect (even if the word segue
has disappeared).
Sometimes (actually rather often) we need to customise the segue animation.
- We can decide not to animate the segue at all, indeed in the
storyboard we can find the attribute
Animates
(true/false) in the attribute inspector by clicking on a segue. This way the destination view controller appears immediately in place of the source view controller. - Or we can decide to perform a custom animation. Usually this is done by implementing an object that conforms to the
UIViewControllerAnimatedTransitioning
protocol. All the magic happens in theanimateTransition
method that gives us access to the source view controller and the destination view controller.
For example, a simple cross-fade segue animation could be something like:
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
UIView* containerView = [transitionContext containerView];
UIViewController* fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController* toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
toVC.view.alpha = 0;
[containerView addSubview:toVC.view];
[UIView animateWithDuration:1 animations:^{
toVC.view.alpha = 1;
fromVC.view.alpha = 0;
} completion:^(BOOL finished) {
[fromVC.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
}
Now the question: how can I get the same in SwiftUI? Is it possible not to animate a navigation or to customise the navigation animation? I expected to be able to do:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination")) {
Text("Navigate!")
}
}
}
.animation(nil)
}
}
or something similar to prevent the animation (or to add a custom animation), but nothing changes.