Search code examples
iosswiftios13

Navigation bar becomes white when a UISearchController is added to it


When I add a UISearchController to a UINavigationItem from an UINavigationController; it becomes white when the view loads and changes to the color specified when the user clicks on the search bar. This happened since ios 13.1. This video shows the behaviour:

https://i.sstatic.net/OhgFQ.jpg

My code consists of a simple storyboard with a NavigationController + a TableViewController, and the NavigationController has a color assigned to it: enter image description here

The ViewController consists of the following code:

class ViewController: UITableViewController {

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.hidesNavigationBarDuringPresentation = false
        searchController.obscuresBackgroundDuringPresentation = false
        navigationItem.searchController = searchController
    }
}

I also added these keys to the info.plist file to force the app into light-mode, but if I remove these the same behaviour is still present:

<key>UIUserInterfaceStyle</key>
<string>Light</string>

This was tested on an iPhone XS Max, running iOS 13.1 beta 1. Is this expected behaviour or a bug which needs to be fixed?


Solution

  • 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