3
votes

Comment masquer la barre de recherche lors du défilement? (sans UITableViewController)

J'ai un simple UIViewController contenant un UITableView et je souhaite masquer la barre de recherche à l'intérieur de la barre de navigation lors du défilement de UITableView. J'ai trouvé

navigationItem.hidesSearchBarWhenScrolling = true

mais cela ne fonctionne pas. Existe-t-il un moyen de le faire fonctionner sur UIViewController?


3 commentaires

quelle est la direction du défilement?


où tu as ajouté ça


Quel problème est survenu est résolu ou non?


3 Réponses :


0
votes

Je suppose que lorsque vous entrez pour la première fois dans UIViewController , UISearchBar est masqué par défaut, étant donné que vous utilisez UISearchController et que vous y accédez avec une icône de recherche ou quelque chose.

Dans ce cas, iOS par défaut ne cache pas le UISearchBar et (le cache / le montre) en fonction de votre direction de défilement dans UITableView maintenant comment résoudre ce .

Comme il n'y a rien que nous puissions faire pour annuler ce comportement, mais que nous pouvons avoir un peu de travail autour d'un peu mieux lorsqu'un utilisateur annule les bandes, nous définissons le UISearchController sur nil code> pour le supprimer du UIViewController et lorsque l'utilisateur tape sur l'icône de recherche, nous lui redonnons une valeur et la montrons.

Remarque: Cette réponse suppose que vous l'implémentez de cette façon étant donné qu'il n'y a pas beaucoup de contexte ni de code dans la question.

Entrons dans le code.

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { // this function is available only in search bar delegate  make sure to conform to it . 
    self.navigationItem.searchController = nil 
}

Nous nous conformons maintenant à UISearchBarDelegate pour accéder à l'action du bouton d'annulation.

 func prepareSearchController() { //function to setup the SearchBar  
    // Setup the Search Controller
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search Items"
    navigationItem.searchController = searchController
    definesPresentationContext = true
}

   @objc func openSearch() { // when user tap on the search icon 
    prepareSearchController()
    self.navigationItem.searchController?.isActive = true
}


0 commentaires

-1
votes

Veuillez essayer cette approche

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

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


0 commentaires

2
votes

Implémentation simple de SWIFT 4

Ajoutez le délégué UISearchBarDelegate à votre classe

Ensuite, ajoutez cette fonction dans votre classe

func showSearchBar() {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchBar.delegate = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = true
    navigationItem.hidesSearchBarWhenScrolling = true 
    //true for hiding, false for keep showing while scrolling
    searchController.searchBar.sizeToFit()
    searchController.searchBar.returnKeyType = UIReturnKeyType.search
    searchController.searchBar.placeholder = "Search here"
    navigationItem.searchController = searchController
}

Puis appelez la fonction dans votre viewDidLoad()


2 commentaires

J'adore comment cela fonctionne. Mais l'ajout de ceci à mon SearchBarDelegate crée simplement une autre barre de recherche.


n'ajoutez simplement pas de barre de recherche du storyboard, ou supprimez la première ligne de la barre de recherche.