I have a UITableView and a Detail View embedded in a UINavigationController as so: I would like to turn on large titles for "My Notes" but I'd like to turn it off for the detail view. Something like how the default Mail app works on iPhone. How would I change the navigation bar's prefersLargeTitle
property during that segue?
it's very simple.
In your DetailView you should set navigationItem.largeTitleDisplayMode to .never
(not navigationController?.navigationItem.largeTitleDisplayMode !!)
navigationItem.largeTitleDisplayMode = .never
SwiftUI version
.navigationBarTitle("Title", displayMode: .inline)
Update for iOS 14 and later:
.navigationTitle("Details")
.navigationBarTitleDisplayMode(.inline)
Any one of both of following, will solve your problem:
set prefersLargeTitles to false for your navigationBar
self.navigationController?.navigationBar.prefersLargeTitles = false
set largeTitleDisplayMode to never for navigationItem (note: prefersLargeTitles must be false otherwise this won't work)
self.navigationController?.navigationItem.largeTitleDisplayMode = .never
Note: if prefersLargeTitles
is true, then largeTitleDisplayMode = .never won't work. Small title display for navigation bar is dependent on prefersLargeTitles
This will enable large title mode if it's value is true
self.navigationController?.navigationBar.prefersLargeTitles = true
I had the same issue just now.
My use case:
MasterVC: basic navigation bar without largeTitle
DetailVC: largeTitle enabled
--> When going back to the MasterVC from the DetailVC I was seeing a weird animation which showed a largeTitle on the Master for a sec before going back to the basic non largeTitle layout. It looked like a glitch.
I fixed it by following this approach:
In MasterVC - viewDidLoad
if #available(iOS 11.0, *) {
navigationItem.largeTitleDisplayMode = .never
navigationController?.navigationBar.prefersLargeTitles = false
}
In DetailVC - viewDidLoad
if #available(iOS 11.0, *) {
navigationItem.largeTitleDisplayMode = .always
navigationController?.navigationBar.prefersLargeTitles = true
}
I hope that can help others.
It should be noted that if you set largeTitleDisplayMode
to never, and prefersLargeTitles
to false on a detail ViewController
, the small title will continue to display for a second when moving from the detail ViewController
to the previous ViewController
via the UINavigationBar
back button.
Use willMove(toParent:)
function to change the title back before the segue is performed.
Swift 4
override func willMove(toParent parent: UIViewController?) {
navigationItem.largeTitleDisplayMode = .always
navigationController?.navigationBar.prefersLargeTitles = true
}
if #available(iOS 11.0, *) {
self.navigationItem.largeTitleDisplayMode = UINavigationItem.LargeTitleDisplayMode.never
} else {
// Fallback on earlier versions
}
UINavigationItemLargeTitleDisplayModeNever
also works, since the implication here is that you don't have access to .never
. @NicolasGrenié You might want to consider some basic tutorials before worrying about title bar size. –
Bend It might be very late but this could be useful for someone..
include the below code on your detail view controller under viewDidLoad
navigationItem.largeTitleDisplayMode = .never
SwiftUI:
step 1. Use ZStack step 2 : .navigationBarTitle("", displayMode: .inline)
I had the same issue and needed to place a NavigationItem on the second ViewController's storyboard. My NavigationItem was being created automatically by the segue and its prefersLargeTitle
in the viewDidLoad()
was not finished loading before the view appeared. Adding a NavigationItem to the storyboard fixed this issue and allowed me to set the prefersLargeTitle
in the storyboard's properties menu.
© 2022 - 2024 — McMap. All rights reserved.
.navigationBarTitleDisplayMode(.inline)
. Plus the navigation title could be set with.navigationTitle("Details")
– Festschrift