web-dev-qa-db-fra.com

La barre de navigation devient blanche lorsqu'un UISearchController y est ajouté

Lorsque j'ajoute un UISearchController à un UINavigationItem à partir d'un UINavigationController; il devient blanc lorsque la vue se charge et prend la couleur spécifiée lorsque l'utilisateur clique sur la barre de recherche. Cela s'est produit depuis iOS 13.1. Cette vidéo montre le comportement:

https://imgur.com/wn5zbnJ

Mon code consiste en un storyboard simple avec un NavigationController + un TableViewController, et le NavigationController a une couleur qui lui est assignée: enter image description here

Le ViewController se compose du code suivant:

class ViewController: UITableViewController {

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

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

J'ai également ajouté ces clés au info.plist fichier pour forcer l'application en mode léger, mais si je les supprime, le même comportement est toujours présent:

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

Cela a été testé sur un iPhone XS Max, exécutant iOS 13.1 beta 1. Est-ce le comportement attendu ou un bug qui doit être corrigé?

9
Devxln

Il semble qu'il soit nécessaire d'utiliser le nouveau UINavigationBarAppearance sur iOS 13. Essayez d'ajouter ceci à votre viewDidLoad:

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

Vous voudrez probablement également définir la couleur de fond du champ de recherche:

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

Cela semble être un bogue dans iOS 13.1. Plus précisément, il existe une nouvelle apparence spécifique à iOS 13 (UINavigationBarAppearance) pour les barres de navigation qui spécifie l'apparence lorsque la vue de défilement est défilée vers le haut, ainsi que l'état par défaut. Normalement, les modifications de ce type ne prennent effet que lorsque l'application est créée avec le SDK correspondant (iOS 13.1). Cependant, il semble y avoir un bogue où le problème se produit également lorsqu'une application est créée à l'aide du SDK iOS 12.

Voir: https://developer.Apple.com/documentation/uikit/uinavigationbarappearance

Mise à jour: il existe une solution de contournement ici: https://itnext.io/fixing-issues-caused-by-future-sdks-ae0896384abf

Essentiellement, si votre application s'exécute sur un appareil exécutant iOS 13, il est possible de créer des instances des nouvelles classes via NSClassFromString () dans Swift, puis d'utiliser un peu de magie d'exécution objective-c pour configurer la barre de navigation.

6
Scott Ahten

Ce que vous vouliez n'était pas clair dans votre question. Si vous le souhaitez, cependant, ajoutez la barre de recherche dans la barre de navigation et avec une couleur spécifique, cela pourrait vous aider.

Le processus de placement de la barre de recherche dans la barre de navigation:

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

Vous pouvez ajouter le contrôleur de votre choix dans la valeur "searchResultsController".

Si vous souhaitez définir la couleur d'arrière-plan dans une couleur spécifique, vous pouvez modifier la teinte de la barre dans Storyborad -> barre de navigation -> barre de navigation attiribute inspection.

En outre, ce code ci-dessous pour le fichier AppDelegate.Swift fera de même. 'tintcolor' et 'titletextcolor' sont commentés

  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
    }
3
Yunus Karakaya

Je rencontre le même problème et j'ai déjà ouvert un radar à Apple. Même si, si vous définissez backgroundColor sur l'apparence de UINavigationBar, la barre de navigation au lieu de devenir transparente lorsque vous tirez vers le bas et affiche la barre de recherche devient cette couleur, mais la barre d'état reste blanche.

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

Voici un code qui essaie d'atténuer ce comportement, mais je suis ouvert à entendre pour la barre d'état

0
Lorenzo V