iOS 11 SearchBar in NavigationBar

avec iOS 11 Apple a redessiné le UISearchBar en faisant les coins plus rond et la hauteur plus grand. Ajouter un UISearchBar à la barre de navigation est assez simple en le paramétrant simplement comme le titreview du navigationItem en utilisant navigationItem.titleView = searchBar .

cependant, dans iOS 11 Il ne semble plus fonctionner comme prévu. Regardez les écrans où nous comparons la même configuration en utilisant iOS 10 et iOS 11

iOS 10 enter image description here

iOS 11 enter image description here

vous pouvez clairement voir que la barre de recherche augmente la taille de la barre de navigation mais les boutons de barre ne sont pas alignés correctement. De plus, la barre de recherche n'utilise plus l'espace disponible sur la gauche.

mettre la barre de recherche dans une vue de wrapper pour obtenir le bouton d'annulation sur iPad comme décrit ici bouton D'Annulation N'est pas montré dans UISearchBar aussi ne semble pas fonctionner plus puisque la barre de recherche est alors pas visible du tout.

si quelqu'un a des problèmes similaires ou sait déjà comment corriger/améliorer ceci je serais très reconnaissant.

cela a été construit en utilisant Xcode 9 Beta 4. Peut-être que les prochaines versions régleront ce problème.

mise à jour:

depuis nous avons décidé d'utiliser la solution suivante. Nous avons ajouté un nouveau UIBarButtonItem à la NavBar qui présente alors un nouveau ViewController où nous ne mettons qu'une barre de recherche et rien d'autre dans la NavBar qui semble fonctionner. Utiliser la réponse choisie peut être la meilleure solution car Apple avec iOS 11 veut que nous utilisions ce nouveau design même si cela ne nous donne pas le résultat que nous voulions à l'origine. Une autre façon de résoudre cela pourrait être une barre de recherche personnalisée, mais c'est un autre sujet.

65
demandé sur PatrickDotStar 2017-07-27 14:52:34

5 réponses

il y a une nouvelle propriété searchController sur navigationItem dans iOS 11.

https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller

utilisez comme ceci...

if #available(iOS 11.0, *) {
     navigationItem.searchController = searchController
} else {
     // Fallback on earlier versions
     navigationItem.titleView = searchController?.searchBar
}

dans L'objectif - c l'énoncé de fi ressemble à ceci:

if (@available(iOS 11.0, *)) {

sur iOS 11, Si vous ne mettez pas navigationItem.hidesSearchBarWhenScrolling = false , la barre de recherche peut être initialement cachée, à moins que l'utilisateur fait défiler vers le bas pour révéler. Si vous le définissez à false, il apparaît empilé ci-dessous où le titre irait sans que l'utilisateur ait à faire défiler.

47
répondu Justin Domnitz 2017-11-08 20:27:04

vous pouvez changer la hauteur de UISearchBar dans iOS 11 en ajoutant une contrainte de hauteur 44:

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
}
15
répondu zgjie 2017-11-01 17:06:06

j'ai eu le même problème et après quelques jours googler le problème, j'ai trouvé cette page - https://translate.google.com/translate?hl=en&sl=zh-CN&u=http://www.jianshu.com/p/262f6e34a7d3&prev=search .

cette page conduit à cette git repo - https://github.com/DreamTravelingLight/searchBarDemo - ce projet de démonstration montre comment utiliser l'ancienne méthode avec titleView pour avoir toujours une barre de recherche sans le problème de taille.

les lignes clés sont ces

_searchBar = [self addSearchBarWithFrame:CGRectMake(0, 0, kScreenWidth - 2 * 44 - 2 * 15, 44)];
UIView *wrapView = [[UIView alloc] initWithFrame:_searchBar.frame];
[wrapView addSubview:_searchBar];
self.navigationItem.titleView = wrapView;

si vous intégrez le UISearchBar à l'intérieur d'une vue, et définissez ce wrapView comme le titleView, le UISearchBar aura la taille que vous avez définie pour lui, et s'adaptera à la barre de navigation comme prévu.

Merci, David

3
répondu David Schechter 2017-09-21 17:50:20

je pense que vous aurez à faire avec la mise en place de la nouvelle UINavigationItem.la propriété searchController de votre objet UISearchController. C'est comme ça qu'on obtient le nouvel effet vu dans les Messages. On dirait que l'ancien comportement a complètement disparu. J'espère me tromper, mais toute L'API a été remaniée pour le 11. Je sais que c'est buggy en général donc nous verrons avec les nouvelles bêtas et le GM si cela est réparé. (Écrit au moment de la Bêta 6)

1
répondu cook 2017-08-15 04:26:33

cela m'a aidé:

    if ([self.navigationItem respondsToSelector:@selector(setSearchController:)])
    {
        [self.navigationItem performSelector:@selector(setSearchController:) withObject:self.searchController];
    }
    else
    {
        self.tableView.tableHeaderView = self.searchController.searchBar;
    }
1
répondu Raunak 2018-01-30 01:07:22