2010-07-12 4 views
3

J'ai une application avec une longue liste de données dans la tableView, et j'aimerais toucher deux fois la barre de navigation pour faire défiler le UITableView sur le dessus de la liste (où la recherche est).Appuyez deux fois sur UINavigationController navigationBar?

Comment puis-je implémenter cela?

Merci pour votre aide.

+0

vous pouvez également appuyer simplement sur le s barre de tatus et il va automatiquement au sommet de votre tableView. Aucun code requis. – Souljacker

Répondre

16

Le geste standard pour faire défiler une table vers le haut est une simple pression sur la barre d'état. Il est activé par défaut voir UIScrollView Reference

Si vous voulez vraiment la barre de navigation et que vous ciblez 3.2 et plus, je recommande d'attacher un UITapGestureRecognizer à la barre de navigation.

- (void)viewDidLoad { 
    UITapGestureRecognizer* tapRecon = [[UITapGestureRecognizer alloc] 
       initWithTarget:self action:@selector(navigationBarDoubleTap:)]; 
    tapRecon.numberOfTapsRequired = 2; 
    [navController.navigationBar addGestureRecognizer:tapRecon]; 
    [tapRecon release]; 
} 

- (void)navigationBarDoubleTap:(UIGestureRecognizer*)recognizer { 
    [tableView setContentOffset:CGPointMake(0,0) animated:YES]; 
} 

Si vous ciblez la version 3.0 ou inférieure, cela peut devenir un peu délicat et n'est pas recommandé.

+1

Le comportement standard est un * simple * robinet. Pas un double tap. –

+0

Oh oui, vous avez raison. – tonklon

+2

J'essayais d'ajouter un reconnaisseur de prise pour un simple tap. Cette approche est seulement viable si vous n'avez pas de bouton de retour, ou rightBarButtonItem. Leurs événements de clic sont remplacés par le système de reconnaissance de gestes. – Drarok

9

Suite à la réponse de tonklon, vous pouvez distinguer les différents éléments de la vue navigationBar en obtenant ses sous-vues.

Les sous-vues du navigationBar sont:

0 LeftButton, 1 titre, 2 RightButton,

donc au lieu de:

[navController.navigationBar addGestureRecognizer:tapRecon]; 

faire pour le titre de la barre de navigation :

[[self.navigationController.navigationBar.subviews objectAtIndex:1] setUserInteractionEnabled:YES]; 
[[self.navigationController.navigationBar.subviews objectAtIndex:1] addGestureRecognizer:tapRecon]; 
+1

Cela fonctionne! Je ne sais pas pourquoi cela n'est pas marqué comme la réponse. – Bot

+0

Deux problèmes: 1) titleView est plus petit que la barre de navigation. 2) l'index de sous-vue peut changer s'il y a plusieurs boutons de gauche (non testés). Voici une autre solution: http://stackoverflow.com/a/21288149/235297 –