In this tutorial, you will learn how to customize UINavigationBar
appearance programmatically within a UIViewController
. You will use the new UINavigationBarAppearance
introduced in iOS 15, but I will also provide a fallback for earlier versions.
Set the Navigation Bar Background and Title Color
For iOS 14 and Earlier
Before iOS 15, you would have to use the barTintColor
property of the UINavigationBar
to set its background color.
override func viewDidLoad() { super.viewDidLoad() // Set navigation bar background colour self.navigationController?.navigationBar.barTintColor = UIColor.cyan // Set navigation bar title text colour self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white] }
In the above code snippet, I set the barTintColor
to cyan and the title text color to white within the viewDidLoad()
method of your UIViewController
.
Remember that if you want to apply the appearance globally to all navigation bars in your application, you should do so in the AppDelegate
or a central place where your navigation controllers are initialized.
For iOS 15 and Newer
Starting with iOS 15, Apple introduced a new way to configure the appearance of the UINavigationBar
using the UINavigationBarAppearance
class. Here’s how you can use it:
if #available(iOS 15.0, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = UIColor.systemCyan appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // Set Title text color navigationItem.standardAppearance = appearance navigationItem.scrollEdgeAppearance = appearance navigationItem.compactAppearance = appearance }
In the above code snippet, I first check whether the iOS version is 15.0 or higher because the appearance API was introduced in iOS 15. You will need to handle the older versions separately due to differences in how the appearance is configured.
In this code snippet, I create a new UINavigationBarAppearance
instance, configure it with an opaque background. Then sets the background color to cyan, and change the title text color to white text.
Set Navigation Bar ItemButton Tint Color
To customize the tint color of navigation bar items such as buttons, you can modify the tintColor
property of the UINavigationBar
. This property affects all bar button items in the navigation bar. The process of setting the tint color for navigation bar items remains consistent across older and newer iOS versions.
// Create a UIBarButtonItem let rightBarButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action:.none) self.navigationController?.navigationBar.tintColor = UIColor.red // Set tint color self.navigationItem.rightBarButtonItem = rightBarButton // Assign the bar button item
First, create a UIBarButtonItem
instance. Next, set the tintColor
property of the navigation bar to the desired color. Finally, assign the newly created UIBarButtonItem
to the rightBarButtonItem
property of the navigationItem
.
Set Navigation Bar Background Image
For iOS 15 and above, create a UINavigationBarAppearance
object and configure it with an opaque background. This is necessary because the default appearance has a translucent background.
// Set Navigation Bar Background Image if #available(iOS 15.0, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() if let navBackgroundImage = UIImage(named: "DynamicIsland") { appearance.backgroundImage = navBackgroundImage } navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance } else { // Set Nav Bar Image For lower iOS version let navBar = navigationController?.navigationBar navBar?.setBackgroundImage(UIImage(named: "DynamicIsland"), for: .default) navBar?.shadowImage = UIImage() }
Next, load the image you want to use as the background from your assets using UIImage
. Assign this image to the backgroundImage
property of the appearance
object.
Then, set both the standardAppearance
and scrollEdgeAppearance
properties of the navigationBar
to the appearance
object you have configured.
For iOS versions below 15, you cannot use the new appearance APIs. Instead, use the setBackgroundImage(_:for:)
method to set the background image directly on the navigation bar. Additionally, remove the shadow image to ensure the image looks seamless.
Conclusion
I hope this tutorial was helpful to you. You now know how to Customize Navigation Bar Appearance Programmatically in UIViewController.
For more Swift code examples and tutorials, please check the Swift Code Examples page on this website.
Happy learning!