web-dev-qa-db-fra.com

Comment utiliser UISearchController dans iOS 8 où UISearchBar est dans ma barre de navigation et a des boutons d'étendue?

J'essaie d'utiliser le nouveau UISearchController d'iOS 8 et d'intégrer son UISearchBar dans mon UINavigationBar. Cela se fait facilement comme suit:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.delegate = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.titleView = searchController.searchBar

Mais quand j'ajoute les boutons de portée:

searchController.searchBar.showsScopeBar = true
searchController.searchBar.scopeButtonTitles = ["Posts, Users, Subreddits"]

Il ajoute les boutons derrière le UISearchBar et semble évidemment très étrange.

Comment dois-je faire cela?

28
Doug Smith

Vous vous heurtez à un "problème de conception" où le scopeBar devrait être masqué lorsque le searchController n'est pas actif.

Les boutons de la barre de portée apparaissent derrière (sous) la barre de recherche car c'est leur emplacement lorsque la barre de recherche devient active et s'anime dans la barre de navigation.

Lorsque la recherche n'est pas active, une barre de portée visible prendrait de la place à l'écran, distrait du contenu et déroutait l'utilisateur (puisque les boutons de portée n'ont aucun résultat à filtrer).

Puisque votre searchBar est déjà situé dans titleView, l'animation de la barre (navigation et recherche) qui révèle la barre de portée ne se produit pas.

  • L'option la plus simple consiste à localiser la barre de recherche sous la barre de navigation et à laisser le searchBar s'animer dans la zone de titre lorsqu'il est activé. La barre de navigation animera sa hauteur, laissant de la place pour inclure la barre de portée qui était cachée. Tout cela sera géré par le contrôleur de recherche.
  • La deuxième option, presque aussi simple, consiste à utiliser une icône de bouton de barre de recherche , qui animera les searchBar et scopeBar en bas sur la barre de navigation.

    - (IBAction)searchButtonClicked:(UIBarButtonItem *)__unused sender {
        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        self.searchController.searchResultsUpdater = self;
        self.searchController.hidesNavigationBarDuringPresentation = NO;
        self.searchController.dimsBackgroundDuringPresentation = NO;
        self.definesPresentationContext = YES;
        self.searchController.searchBar.scopeButtonTitles = @[@"Posts", @"Users", @"Subreddits"];
        [self presentViewController:self.searchController animated:YES completion:nil];
    }
  • Si vous voulez que le searchBar reste dans le titleView, une animation pour faire ce que vous voulez n'est pas intégrée. Vous devrez rouler votre propre code pour gérer le changement de hauteur de navigationBar et afficher votre propre barre de portée ( ou accrocher dans les internes, et animer le scopeBar intégré vers le bas et en vue).

    Si vous avez de la chance, quelqu'un d'autre a écrit willPresentSearchController: code pour gérer la transition souhaitée.

  • Si vous voulez toujours voir un searchBar et scopeBar, vous devrez probablement abandonner en utilisant le scopeBar intégré, et le remplacer par un UISegmentedControl que l'utilisateur verra toujours, même lorsque le contrôleur de recherche n'est pas actif.

Mise à jour:

Cette réponse a suggéré de sous-classer UISearchController pour changer la hauteur de sa barre de recherche.

22
user4151918