How do I turn off large titles for UINavigationBar

2019-06-15 07:38发布

I have a UITableView and a Detail View embedded in a UINavigationController as so: enter image description hereI 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?

6条回答
爷、活的狠高调
2楼-- · 2019-06-15 07:57

Any one of both of following, will solve your problem:

  1. set prefersLargeTitles to false for your navigationBar

    self.navigationController?.navigationBar.prefersLargeTitles = false
    
  2. 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
查看更多
ら.Afraid
3楼-- · 2019-06-15 08:02

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.

查看更多
小情绪 Triste *
4楼-- · 2019-06-15 08:03

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
}
查看更多
爷、活的狠高调
5楼-- · 2019-06-15 08:11

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
查看更多
我只想做你的唯一
6楼-- · 2019-06-15 08:14

it's very simple.

In your DetailView you should set navigationItem.largeTitleDisplayMode to .never

(not navigationController?.navigationItem.largeTitleDisplayMode !!)

navigationItem.largeTitleDisplayMode = .never
查看更多
三岁会撩人
7楼-- · 2019-06-15 08:22
    if #available(iOS 11.0, *) {
        self.navigationItem.largeTitleDisplayMode = UINavigationItem.LargeTitleDisplayMode.never
    } else {
        // Fallback on earlier versions
    }
查看更多
登录 后发表回答