Navigation bar becomes white when a UISearchController is added to it

守給你的承諾、 提交于 2019-11-27 21:25:14

问题


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://imgur.com/wn5zbnJ

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

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?


回答1:


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



回答2:


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.




回答3:


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
    }



回答4:


I'm experiencing same issue, and already opened a radar to Apple. Even though, if you set the backgroundColor to the appearance of the UINavigationBar, then the navigation bar instead of becoming transparent when pulling down and showing the search bar becomes that color, but then the status bar still remains white.

UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().barTintColor = .blue
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
UINavigationBar.appearance().backgroundColor = .red

Here is some code that tries to mitigate that behaviour, but I'm open to hear for the status bar thing



来源:https://stackoverflow.com/questions/57746292/navigation-bar-becomes-white-when-a-uisearchcontroller-is-added-to-it

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!