It's possible to achieve this kinda transition.
Here, I describe how to implement this with your chart.
As your chart shows, assume you have VC1, VC2, VC3 (top to bottom) and VCX (w/ blue box). You need to define transitions and associated animation directions (push: right-to-left or pop:left-to-right). As your chart, if you define the transitions and animations as:
- VC1 to : VC2(push), VCX(push)
- VC2 to : VC3(push), VCX(push)
- VC3 to : VCX(push)
- VCX to : VC3(pop)
and assume we have all of the view controllers instantiated already, then,
at VC1:
navigationController!.pushViewController(VC2, animated: true)
at VC2:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// remove VC1 from navigation stack (I assume VC1 is not a root VC)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
allControllers.removeObject(at: allControllers.count - 2)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
at VC1:
navigationController!.pushViewController(VCX, animated: true)
at VCX: (A)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
if (navigationController!.viewControllers[allControllers.count-2] != VC3) {
// if not from VC3, remove VC from stack and put VC3
allControllers.removeObject(at: allControllers.count - 2)
allControllers.insert(VC3, at: allControllers.count - 1)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
at VC2:
navigationController!.pushViewController(VC3, animated: true)
at VC3: (B)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
if (navigationController!.viewControllers[allControllers.count-2] == VC2) {
// if from VC2, remove it
allControllers.removeObject(at: allControllers.count - 2)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
}
at VC2:
navigationController!.pushViewController(VCX, animated: true)
at VCX: same as (A)
at VCX:
navigationController!.popViewController(animated: true)
at VC3: same as (B)
Note viewDidAppear is called when users swipe (left-to-right) to go back and cancel it on the way (== swipe back to left). So, you need some more small code at viewDidAppear against that situation.
If you want the different animation direction, by manipulating stack and using push/pop, you can easily achieve it. This explains how.