Search code examples
iosswiftuinavigationcontrolleruinavigationbar

Large title to small title switch in navigation bar is not smooth iOS 13, sticky


I have a UINavigationController with default value of it's navigationBar.prefersLargeTitles = true .

I am switching that to false when I push into a new scene lets call it (DetailsViewController), by changing it into the viewWillDisappear .

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

Now in DetailsViewController I am using willMove(to parent:) .

override func willMove(toParent parent: UIViewController?) {
        navigationController?.navigationBar.prefersLargeTitles = true
}

To transition back to large titles .

Observe the attached snapshots of how iOS 13 doing it with how iOS 12 is doing it, considering iOS 12 is the correct behavior.

iOS 13 :

iOS 13

iOS 12 :

iOS 12


Solution

  • What you're doing was always wrong. You should set prefersLargeTitles to true once for the navigation bar and never touch it again.

    The way to change what each view controller does about large titles as it appears is that that view controller sets its own navigationItem (in its viewDidLoad) to have the desired largeTitleDisplayMode. So if the first v.c. has .always and the second has .never everything will be smooth.