web-dev-qa-db-fra.com

Afficher la barre de recherche dans la barre de navigation sans défilement sur iOS 11

J'attache un UISearchController au navigationItem.searchController propriété d'un UITableViewController sur iOS 11. Cela fonctionne très bien: je peux utiliser la barre de recherche Nice iOS 11-style.

Cependant, je souhaite que la barre de recherche soit visible au lancement. Par défaut, l'utilisateur doit faire défiler la vue tableau pour voir la barre de recherche. Est-ce que quelqu'un sait comment c'est possible?

enter image description hereenter image description here

Gauche: situation par défaut après le lancement. Droite: barre de recherche rendue visible (par défilement vers le haut). J'aimerais que la barre de recherche soit visible après le lancement, comme dans la capture d'écran de droite.

J'ai déjà constaté que la barre de recherche pouvait être rendue visible en définissant la propriété hidesSearchBarWhenScrolling de mon élément de navigation sur false. Cependant, la barre de recherche est toujours visible, même lorsque vous faites défiler l'écran, ce qui n'est pas ce que je veux.

61
Jonathan

Ce qui suit rend la barre de défilement visible au début, puis lui permet de se cacher lors du défilement:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

Utiliser isActive ne fait pas ce que je voulais, la barre de défilement est active (affiche le bouton Annuler, etc.), alors que tout ce que je veux, c’est pour qu’elle soit visible.

148
Jordan Wood

Vous pouvez définir la propriété isActive sur true après avoir ajouté le searchController à la commande navigationItem.

Juste comme ça:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}
3
txaidw

Les éléments suivants font de searchBar le statut de premier répondant:

   override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        DispatchQueue.main.async {
            self.searchController.searchBar.becomeFirstResponder()
        }
    }
0
Ari Pratomo