Smooth transition when changing navigation bar "prefersLargeTitles"

1.6k Views Asked by At

I have a view controller that is pushed onto a navigation stack. The stack has navigationBar.prefersLargeTitles = true, whilst this new view controller has navigationBar.prefersLargeTitles = false. I achieve this using the following code in the view controller that is pushed onto the stack:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.prefersLargeTitles = false
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.navigationBar.prefersLargeTitles = true
}

However, when I return back to the presenting view controller, the change in the navigation bar from navigationBar.prefersLargeTitles = false to navigationBar.prefersLargeTitles = true is a bit glitchy. Is there any way to make this smoother?

Many thanks

1

There are 1 best solutions below

2
On BEST ANSWER

Instead of directly changing the preference via the navigation controller, you should change the behavior via the navigation item of the specific view controller you would like to affect.

// Root UIViewController
class ViewControllerA: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.largeTitleDisplayMode = .always
    }
}

// Pushed UIViewController
class ViewControllerB: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationItem.largeTitleDisplayMode = .never
    }
}

You can remove the lines you have in viewWillAppear and viewWillDisappear.