0

J'ai une vue qui contient un UISearchBar. Cet UISearchBar est pas affiché en haut de la page - il est à environ 90 pts en bas du haut de l'écran, sous une image d'en-tête.setContentOffset pas correctement lors de l'annulation d'une recherche

Tous les éléments de la vue sont enveloppés dans un UIScrollView. La bonne chose se produit lorsque l'utilisateur tape dans l'UISearchBar - la vue entière est défilée de sorte que la barre de recherche est en haut de l'écran, une superposition sombre apparaît sur le contenu de la vue, et le clavier glisse vers le haut.

Tout va bien jusqu'ici. Le problème vient quand je veux annuler la recherche, et que tout le contenu retourne à son emplacement précédent (avec l'UISearchBar n'est plus en haut de l'écran).

Je peux le faire si l'utilisateur clique sur annuler pendant que le clavier s'affiche - il suffit d'écouter UIKeyboardWillHideNotification, puis redéfinir le contenu de la vue de défilement sur (0, 0). Toutefois, si l'utilisateur fait glisser son doigt sur certains résultats de recherche, le clavier disparaîtra pour vous permettre d'avoir une vue plus large des résultats de la recherche. Si l'utilisateur clique alors sur annuler, la barre de recherche reste en haut de la page, et tout a l'air terrible.

J'ai essayé de mettre le code « setContentOffset » dans le UISearchDisplayDelegate:

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView 
{ 
    [_scrollView setContentOffset:CGPointMake(0,0) animated:YES]; 
} 

Cela fonctionne, mais ne semble pas très bien, parce que le défilement ne se produit pas avant les résultats de la recherche sont loin fanées (donc vous voyez deux animations séparées).

J'ai ensuite essayé cette méthode (qui est appelé juste avant l'affichage du tableau est caché):

- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView 
{ 
    [_scrollView setContentOffset:CGPointMake(0,0) animated:YES]; 
} 

Toutefois, cela n'a pas d'effet. Le décalage de contenu n'est pas modifié.

Des conseils?

Répondre

0

Peut-être que le contrôleur d'affichage de recherche définit le décalage de contenu pour vous? Essayez plutôt de définir le décalage de contenu dans searchDisplayController:didShowSearchResultsTableView:.

+0

Le contrôleur d'affichage de recherche définit certainement le décalage de contenu lorsque la barre de recherche obtient le focus. Le problème que j'ai est de retourner le décalage de la vue de défilement à 0, 0 lorsque l'utilisateur appuie sur Annuler ET le clavier est déjà caché. searchDisplayController: didShowSearchResultsTableView: n'est jamais appelé lorsque l'utilisateur tape sur cancel. – MikeQ

+0

Si cela ne vous dérange pas quelque chose de légèrement sournois, vous pouvez utiliser quelque chose comme '- (BOOL) respondsToSelector: (sélecteur SEL) {NSLog (@"% @ ", NSStringFromSelector (sélecteur)); return [super respondsToSelector: selector];} 'pour voir ce que les autres méthodes UISearchDisplayController utilisent, et les remplacer pour voir si elles ont un effet. –