Use the increased navigation-bar title in iOS 11

60,935

Solution 1

The only change done to UINavigationBar API for iOS 11 is prefersLargeTitles.

Documentation here: https://developer.apple.com/documentation/uikit/uinavigationbar/

You can do it to your own apps with one small change: check "Prefers Large Titles" for your navigation bar in IB, or if you prefer to do it in code using:

navigationController?.navigationBar.prefersLargeTitles = true

If you need to change the text attributes of the large title you need to use the new largeTitleTextAttributes property on UINavigationBar:

UINavigationBar.appearance().largeTitleTextAttributes = [
    NSAttributedString.Key.foregroundColor: UIColor.black
]

Solution 2

UINavigationBar has a prefersLargeTitles: Bool property. Docs here.

class UINavigationBar {
   var prefersLargeTitles: Bool
}

UINavigationItem has a largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode property. Docs here.

class UINavigationItem {
   var largeTitleDisplayMode: LargeTitleDisplayMode
}

Both of these can be modified in the Interface Builder.

To turn on this behavior set navigationController.navigationBar.prefersLargeTitles to true. Then you can control each individual view controller in the navigation controller stack by setting navigationItem.largeTitleDisplayMode.

The general design guidelines by Apple are that large titles shouldn't be used everywhere (for example, the Clock app does not use them), and it's generally preferred that only the first level of the navigation controller uses the large titles. However, these are just general guidelines.

Large titles are introduced in What's New in Cocoa Touch video (7:37).

Solution 3

Just check "Prefers Large Titles" in the Navigation Bar attribute inspector in Storyboard / Interface Builder:

enter image description here

Solution 4

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationController?.navigationBar.topItem?.title = "Hello"
    navigationController?.navigationItem.largeTitleDisplayMode = .automatic

    let attributes = [
        NSAttributedStringKey.foregroundColor : UIColor.red,
        ]

    navigationController?.navigationBar.largeTitleTextAttributes = attributes
} else {
    // Fallback on earlier versions
}

Solution 5

if #available(iOS 11.0, *) {
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationItem.largeTitleDisplayMode = .always
} else {
    // Fallback on earlier versions
}

Note that there are some bugs in beta 1 which cause the large title to only appear when you manually scroll up.

Share:
60,935
Hans Knöchel
Author by

Hans Knöchel

Updated on July 05, 2022

Comments

  • Hans Knöchel
    Hans Knöchel almost 2 years

    iOS 11 Beta 1 uses the increased navigation-bar title for almost all system-apps (it started doing this in iOS 10 and the Music app). I am wondering if Apple has a public API for this coming in iOS 11, or whether it will stay private for now.

    The behavior is that the title has an increased font-size, is left aligned and will move to the navigation-bar once the user scrolls down. I've attached some screens showing this behavior in the Messages app here:

    enter image description here

    Although I could not find any reference in the UINavigationController and UINavigationBar so far, maybe someone knows some more details!

  • Gunnar Torfi Steinarsson
    Gunnar Torfi Steinarsson almost 7 years
    I know this is a completely different question but I'm not sure if it's worth posting a new question for. Have you found a way to change the large title text color (foreground color)?
  • Moin Shirazi
    Moin Shirazi almost 7 years
    I think its still a bug .... please check openradar.me/32658968
  • Daniel Wood
    Daniel Wood almost 7 years
    The property to change large title attributes is largeTitleTextAttributes as answered here: stackoverflow.com/a/45020883/106703. I guess this makes sense so the large and regular titles can be styled independently.
  • Moin Shirazi
    Moin Shirazi almost 7 years
    @DanielWood can you please edit it in the same answer.. it will be helpful for other users too
  • Roi Mulia
    Roi Mulia almost 7 years
    Jordi, I have a UICollectionView inside my root UIViewController. When I scroll, than push another VC than go back to the root one, the Navigation Bar collapse to the small one (even if i'm adding your code). Does it the same bug as you described?
  • Jordi Bruin
    Jordi Bruin almost 7 years
    Hi @RoiMulia, that sounds like a different bug. When you return to the previous VC, is the content still scrolled? If so it's expected behaviour because the large navbar should only be shown when scrolled all the way to the top I believe.
  • Roi Mulia
    Roi Mulia almost 7 years
    Yes, The content is still scrolled. What's even more weird, is that after I go to the root VC and the title collapse, if I scroll again (no matter what direction) the titles go back to beings large (anon smooth animation). Seems like a bug?
  • emmics
    emmics over 6 years
    Just to update the answer: NSForegroundColorAttributeName has been renamed to NSAttributedStringKey.foregroundColor .
  • Nico AD
    Nico AD over 6 years
    i have an issue with ios 11 as well, I m updating a 2016 app (ios 8) and for some reason the navigation is broken. the navigation bar is covered with a bar with a uniform background color. using prefersLargeTitles make it worst as the navigation bar disappears
  • ScottyBlades
    ScottyBlades about 3 years
    This seems to have no effect for me.