web-dev-qa-db-fra.com

UISearchBar présenté par UISearchController en vue d'en-tête de tableau s'anime trop lorsqu'il est actif

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: Inactive search bar in correct position

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: 

Screenshot showing search bar animated too far down

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? 

55
Zoë Smith

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!

27
Brian Sachetta

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.

63
ppilone

J'ai pu empêcher UISearchBar de décaler en supprimant la ligne suivante de mon ViewController: self.definesPresentationContext = YES; 

28
Piotr Tomasik

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
19
Gleb

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) 

15
Sozin's Comet

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!

14
M. Porooshani

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. 

6
Zoë Smith

décochant Ajuster les encarts de la vue de défilement 

et

vérification de sous les barres supérieures

Fixé mon problème  enter image description here

4
Basil Mariano

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
2
side

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

1
Hawe

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
0
hashier

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

0
demylia

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é. 

0
Alex Medearis

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
0
Prit_Singh