87 votes

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

J'associe un UISearchController à l'interface de l'utilisateur. navigationItem.searchController d'un UITableViewController sous iOS 11. Cela fonctionne bien : Je peux utiliser la jolie barre de recherche de style iOS 11.

Cependant, j'aimerais que la barre de recherche soit visible au lancement. Par défaut, l'utilisateur doit faire défiler la vue du tableau vers le haut pour voir la barre de recherche. Quelqu'un sait-il comment cela est possible ?

enter image description here enter image description here

A gauche : situation par défaut après le lancement. A droite : barre de recherche rendue visible (en faisant défiler l'écran 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 peut être rendue visible en définissant la propriété hidesSearchBarWhenScrolling de mon élément de navigation à false. Cependant, la barre de recherche reste toujours visible, même lorsque l'on fait défiler la page vers le bas, ce qui n'est pas ce que je souhaite.

204voto

Jordan Wood Points 1476

L'exemple suivant rend la barre de défilement visible au début, puis permet de la masquer 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
    }
}

Utilisation de isActive n'a pas fait ce que je voulais, il rend la barre de défilement active (affichant le bouton d'annulation, etc.), alors que tout ce que je veux, c'est qu'elle soit visible.

6voto

txaidw Points 281

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

Comme ça :

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

1voto

Ari Pratomo Points 61

Les éléments suivants permettent à searchBar de devenir le premier intervenant :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X