J'utilise UISearchController pour présenter une barre de recherche dans la vue d'en-tête d'une vue de table:
...
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
(où il est nécessaire de définir deux fois la propriété tableHeaderView, sinon la vue d'en-tête chevauche la première ligne, c.f. quelques réponses sur S.O. )
Voici à quoi ça ressemble, parfaitement en position quand il est inactif:
La barre de recherche doit rester en place lorsqu'elle est active. Je ne veux pas qu'elle se déplace vers le haut pour masquer la barre de navigation. Mais il s'annonce de manière inattendue, laissant un espace vide entre celui-ci et la barre de navigation:
Voici une vidéo d'animation de barre de recherche bizarre
Si j'utilise simplement une barre de recherche séparément de UISearchController, elle ne montre pas le même comportement lorsqu'elle devient active.
Dans mon contrôleur de vue de présentation, j'ai les codes self.definesPresentationContext = YES;
et self.navigationController.navigationBar.translucent = YES;
et, dans IB, aucune des cases "extension des contours" n'est active (toutes semblaient être des éléments susceptibles de gêner la lecture de la présentation de recherche).
Est-ce que quelqu'un sait comment je peux empêcher la barre de recherche de s'animer?
Ok, alors j'ai finalement trouvé une solution pour moi-même. Bien qu'il soit plus que probable que notre code/scénario ait d'autres éléments (c'est pourquoi il est difficile de répondre à cette question), j'ai pour la plupart suivi le tutoriel d'Apple sur UISearchController: ( https://developer.Apple.com/ bibliothèque/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html )
À peu près tout mon code est identique au leur, mais je ne pouvais pas empêcher la barre de recherche de sauter lorsque je cliquais à l'intérieur. Donc, ce que j'ai fait était de vérifier "sous les barres opaques" pour la vue de table d'origine et la vue de table de résultats de recherche dans mon storyboard. Cela a eu la barre de recherche pour arrêter de sauter.
Mais il y avait un dernier problème, à savoir le fait que la première ligne de la vue du tableau de résultats était masquée par la barre de recherche. Afin de remédier à cela, j’ai ajouté self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);
à la méthode viewDidLoad
de la vue Table des résultats. Voila!
Vieille question, mais j’ai pu résoudre ce problème en réglant
self.extendedLayoutIncludesOpaqueBars = YES;
sur mon contrôleur de vue. Je pense que le problème est dû au fait que la barre de navigation est opaque mais que le paramètre hidesNavigationBarDuringPresentation
est défini sur NO
sur votre moteur de recherche, ce qui entraîne le positionnement incorrect de la barre de recherche lorsqu'elle est activée.
J'ai pu empêcher UISearchBar
de décaler en supprimant la ligne suivante de mon ViewController: self.definesPresentationContext = YES;
definePresentationContext = true
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
self.tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
Mon tour. J'ai également eu ce problème lorsque j'ai suivi l'exemple de code WWDC.
J'ai remarqué que si je ne définissais pas la propriété scopeButtonTitles du searchBar, le searchBar ne serait pas visible. En regardant de plus près, il a juste eu un cadre de CGRectZero. Cela signifie que la définition de scopeButtonTitles définit le cadre dans les coulisses. Donc, si vous ne voulez pas afficher de scopeButtonTitles, mais que vous ne voulez toujours pas avoir à coder UISearchBar en dur à une hauteur spécifique, définissez scopeButtonTitles sur un tableau vide.
self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar
Définir les champs scopeButtonTitles sur un tableau de 1 chaînes n'affichera pas les titres des boutons de la portée, mais aura toujours une logique pour traiter la vue, ce qui va essentiellement bousiller la mise en page.
Accessoires de l'équipe d'assurance qualité d'Apple (applicable à iOS 8)
J'ai couru à ce problème tout récemment et aucune des solutions ne fonctionnait pour moi. Peut-être parce que mon interface utilisateur est plus complexe (ma vue de table avec des supports de recherche contenus dans UITabController à l'intérieur d'un UiNavigationController) de toute façon, aucun des travailleurs ci-dessus . Je pourrais simplement résoudre mon problème avec ce très beau morceau de code trouvé à l'adresse: UISearchController ne réaffiche pas la barre de navigation lors de la rotation
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
if (bar == searchController.searchBar) {
return UIBarPositionTopAttached;
}
else { // Handle other cases
return UIBarPositionAny;
}
}
Encore une chose à ajouter: après avoir configuré toute la hiérarchie de mon contrôleur pour qu'elle s'étende sous les barres opaques et supérieures, ma barre de recherche a commencé à apparaître masquée sous la barre de navigation et serait apparue juste après une rotation éventuelle. c’était un signe pour moi qu’il y avait une erreur d’affichage et que certaines informations concernant ma mise en page n’étaient pas correctes. cette méthode de délégation aide mon contrôleur à comprendre la situation à propos de la barre de recherche par ailleurs nomade!
Je l'ai trouvé! Cela semble être la ligne offensive dans viewDidLoad
de la présentation vc:
self.edgesForExtendedLayout = UIRectEdgeNone;
Supprimé cela et la barre de recherche est restée en place comme prévu.
pour iOS 11 & Swift 4, définissez la ligne ci-dessous dans le viewController a résolu mon problème (saut de la barre de recherche):
self.edgesForExtendedLayout = .bottom
Je suppose que vous définissez UISearchBar frame.original.y = 64
il y a le code
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
searchBar.frame = CGRectMake(0, 0, 376, 44);
laver peut vous aider
Comme mentionné dans le premier post, tout le monde avait besoin d'une solution différente. Alors voici le mien. Je devais combiner deux choses mentionnées sur cette page, à savoir:
Swift 2:
navigationController?.navigationBar.translucent = true
edgesForExtendedLayout = .None
Si vous utilisez UINavigationController
et TabBar
, vous ne pouvez pas utiliser:
self.extendedLayoutIncludesOpaqueBars = true
Vous auriez besoin de cette solution: https://stackoverflow.com/a/46151063/3369381
Dans mon cas, régler la barre de navigation sur self.navigationController.navigationBar.translucent = NO;
a résolu le problème. Il semble que la couche de présentation de la barre de recherche ne prenne pas en compte la translucidité de la barre de navigation lors de la présentation de la barre de recherche.
Je réalise que ce n’est pas une solution parfaite, car la translucidité de la barre de navigation peut nuire à la présentation ailleurs, mais elle résout au moins le problème dans le cas où une barre de navigation non translucide est une possibilité.
il suffit de faire clipsToBounds = true de la vue en-tête de la vue tableau dans la barre de recherche.
countryTableView.tableHeaderView?.clipsToBounds = true