Search code examples
iosswiftcosmicmind

Is it possible to use NavigationBarViewController as UINavigationController to push View Controllers on the stack


I'm working on replacing UINavigationControllers and other iOS standard UI classes with https://github.com/CosmicMind/Material and am stuck with NavigationBarViewController in particular. I know that under the hood it uses parent/child controller setup to present new view controllers on itself but I can't figure out how can I have just basic navigation VC push onto the stack with a back button on the left to go back. Going through the source code of NavigationBarViewController doesn't seem like there is a way to do it. Is it possible to do it with NavigationBarViewController?


Solution

  • To transition the mainViewController, which is the body of the NavigationBarViewController, you can use the

    transitionFromMainViewController
    

    method. It supports animation options, though, not the MoveIn or Push animation.

    In order to do that, you need to use the transition method that is available in the MaterialAnimation API.

    Example:

    let vc: HashtagListViewController = HashtagListViewController()
        vc.view.layer.addAnimation(MaterialAnimation.transition(.MoveIn, direction: .Right), forKey: kCATransitionFromRight)
    
        navigationBarViewController?.transitionFromMainViewController(vc)
    

    Basically what you are doing is tapping into the transition animation for the UIViewController.view.layer.

    If you do not want to go to that effort, the

    transitionFromMainViewController
    

    offers some nice out of the box animations that you can use.

    In a future version of Material, there will be an entire NavigationViewController Stack that will do all that you are asking.

    Update

    In Material 1.36.0, there are two new classes, NavigationBar and NavigationController. NavigationController is a subclass of UINavigationController, so all the features for pushing and popping UIViewControllers on the stack of items is the same, while getting the ability to customize the controller's look and feel with ease.

    The example App project shows how to use this.