Navigation bar becomes white when a UISearchController is added to it

It looks like it is required to use the new UINavigationBarAppearance on iOS 13. Try to add this to your viewDidLoad:

let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .systemRed
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance

You will probably also want to set the searchField backgroundColor:

let searchField = searchController.searchBar.searchTextField
searchField.backgroundColor = .systemBackground

This appears to be a bug in iOS 13.1. Specifically, there is a new iOS 13 specific appearance (UINavigationBarAppearance) for navigation bars which specifies the appearance when the scroll view is scrolled to the top, along with the default state. Normally changes like this only go into effect when the app is built with the corresponding SDK (iOS 13.1). However, there seems to be a bug where the behavior also occurs when an app is built using the iOS 12 SDK.

See: https://developer.apple.com/documentation/uikit/uinavigationbarappearance

Update: There is a workaround here: https://itnext.io/fixing-issues-caused-by-future-sdks-ae0896384abf

Essentially, if your app is running on a device running iOS 13, it's possible to create instances of the new classes via NSClassFromString() in swift, then use a bit of objective-c runtime magic to configure the navigation bar.


What you want was not clear in your question. If you want, however, add searchbar into navigationBar and with a specific color this might help you.

The process of placing seachbar into navigation bar:

let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController

You can add whatever controller you want into 'searchResultsController' value.

If you want to set background color into a specific color, you can change the bar tint from Storyborad -> navigationbar -> navigation bar attiribute inspection.

Also, this below code for the AppDelegate.swift file will do the same. 'tintcolor' and 'titletextcolor' is commented

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        let navigationBarAppearace = UINavigationBar.appearance()
        navigationBarAppearace.barTintColor = UIColor.blue

        // navigationBarAppearace.tintColor = UIColor.red
        //navigationBarAppearace.titleTextAttributes = [.foregroundColor: UIColor.red]
        return true
    }

Tags:

Ios

Swift

Ios13