web-dev-qa-db-fra.com

Barre de recherche UISearchController dans tableHeaderView animée hors de l'écran

J'ai un UISearchController avec un UITableViewController en tant que searchResultsController, le UISearchBar de ce searchController est défini dans le tableHeaderView de mon tableView affiché dans ma racine ViewController. Presque tout fonctionne bien, comme prévu. Mais dans l'animation de UISearchBar (quand je clique sur le searchBar et que le UINavigationBar se cache et que le searchBar se place en haut, comme dans le UISearchDisplayController), j'ai un comportement étrange. Au lieu de passer à la position de UINavigationBar (y: 0), il sort de l'écran et lance l'animation qui affiche le bouton d'annulation. J'ai essayé de déplacer mon code d'instanciation vers le viewDidLoad au lieu de init, et les choses sont exactement les mêmes. Je pense que le centre du problème est dans le cadre de la vue de searchResultsController, mais je ne suis pas sûr à ce sujet (j'ai essayé de définir le cadre, sans succès). Tout ce que je fais est en code pur.

Voici la partie pertinente du code:

- (void) viewDidLoad { 
    [super viewDidLoad];

    // search controller setup
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController];
    self.searchController.delegate = self;
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.delegate = self;

    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;

    self.searchController.definesPresentationContext = YES;
}

Et j'ai une charge paresseuse pour le searchResultsController:

- (UITableViewController *)searchResultsController {
    if (_searchResultsController == nil) {
        _searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
        _searchResultsController.tableView.delegate = self;
        _searchResultsController.tableView.dataSource = self;
    }
    return _searchResultsController;
}

J'ai téléchargé l'exemple de code d'Apple, mais ils utilisent StoryBoards et un xib pour UITableViewCell, le SearchController fonctionne parfaitement dans le projet. Est-ce que quelqu'un a eu le même problème? Comment puis-je réparer cela? Toute solution ou suggestion serait appréciée.

Merci pour l'attention.

30
Tiago Maia

Ajouter

self.extendedLayoutIncludesOpaqueBars = YES;

sur la méthode viewDidLoad

23
dexcell

Avez-vous essayé de définir false sur hidesNavigationBarDuringPresentation? J'ai résolu mon mal de tête ..

self.searchController.hidesNavigationBarDuringPresentation = false;

Mettre la barre de recherche dans la barre de navigation donne une expérience utilisateur plus solide à mon avis (pour iphone)

self.navigationItem.titleView = self.searchController.searchBar;
20
Piet Grootnoten

Pour clarifier cela @, la réponse de Lorenzo a fonctionné pour moi.

self.definesPresentationContext = YES;
15
Cedrick

Essayez ceci:

Vous devez d’abord déléguer le 

UISearchControllerDelegate

Pour Swift

func willPresentSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    self.navigationController?.navigationBar.translucent = false
}
7
Inuyasha

Dans Swift, essayez:

override func viewDidLoad() {
    edgesForExtendedLayout = []
    searchController.hidesNavigationBarDuringPresentation = false

    // ...
}
3
XFreire

Swift 3.01

func willPresentSearchController(searchController: UISearchController){
self.navigationController?.navigationBar.isTranslucent = true
}

func willDismissSearchController(searchController: UISearchController) {
self.navigationController?.navigationBar.isTranslucent = false
}
1
Maksim Kniazev

Dans mon cas, le searchBar se trouvait dans la tableHeaderView et il n'y avait pas de NavigationBar à l'écran. Mais la barre de recherche est toujours animée et recouvre la barre d’état lorsqu’elle devient active. La solution pour éviter cela était de définir:

searchController.hidesNavigationBarDuringPresentation = false

Ce qui est bizarre parce que, comme je l'ai dit, le contrôleur de vue n'utilisait pas de barre de navigation.

0
agilityvision

J'ai remarqué que UISearchController fonctionne parfaitement dans l'une de mes vues mais pas dans l'autre. Le problème était lié à UITableViewController et non à UIViewController. Si vous passez à un UIViewController avec un UITableView à l'intérieur et s'il est correctement contraint, aucun problème ne survient. J'ai implémenté le mien avec un XIB et cela a fonctionné parfaitement.

0
Aaron