Use the increased navigation-bar title in iOS 11
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).
Just check "Prefers Large Titles" in the Navigation Bar attribute inspector in Storyboard / Interface Builder:
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
}
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
]