iosswiftuinavigationbarpreferslargetitles

Smooth transition when changing navigation bar "prefersLargeTitles"


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


Solution

  • 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.