[Résolu] UITapGestureRecognizer : implémentation
Bonsoir à tous,
Je cherche à mettre en place la reconnaissance de geste dans mon ViewController (en l'occurrence le tap pour commencer).
Voici ce que j'ai écris
- (void)viewDidLoad
{
[super viewDidLoad];
tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap];
[self.view addGestureRecognizer:tapRecognizer];
// Do any additional setup after loading the view.
}
Dans le .h j'ai décalaré UITapGestureRecognizer *tapRecognizer;
Dans l'état actuel la méthode handleTap: n'est jamais appelé. A cet instant elle ne contient qu'un NSLog.
J'ai lu pas mal de tuto et de code exemple car je souhaite détecter plusieurs type de gestes ; mais là je galère.
D'avance merci de votre aide....
seb
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
1. Essaye d'utiliser les balises "code" lorsque tu mets du code, car même avec les couleurs, c'est pas très lisible...
2. Je n'ai pas une grande expérience des Gesture, je n'ai utilisé qu'un longPress, mais voici ce que j'ai fait et qui fonctionne (pour le long press)
et la méthode handleLongPressure :
sans oublier bien sûr de mettre UIGestureRecognizerDelegate dans la liste des delegate...
Bonjour,
Merci pour votre aide. La nuit aussi porte conseil.
Voici donc ce que j'ai fait et qui semble fonctionné : J'ai déplacé mon code dans l'init à la place du viewdidload. @Ali je pense que userInteractionsEnabled est à YES par défaut. J'avais rajouté puis j'ai supprimer cette ligne.
Mon code pour exemple :
Merci pour votre aide
Hello,
Y a quand même un problème avec ton code, pourquoi tu crée une nouvelle vue ?
Normalement tu dois avoir une vue dans ton xib, qui est la vue principale de ton contrôleur, non ?
Le premier code que tu as posté est le plus propre et c'est lui qui doit marcher . Y a un problème quelque part avec ta vue principale du xib. vérifier les userActionEnabled,... ou bien dans le pire des cas, tu supprime la vue principale et tu remet une autre.
Le delegate est optionnel, ça vient d'ailleurs.
Voilà ta problème !
Tu as essayé de acceder les composantes avant qu'ils soient déserialisés. Ne touches pas les composantes que dans awakeFromNib ou plus tard - moi, je mets ce qui concerne les composantes dans viewDidLoad.
Autre chose - pourquoi tu crées le view ? Si on chargeait le viewController d'un xib, le view est déserialisé au même temps, mais le view ne sera pas accessible avant le fin du déserialisation, soit dans viewDidLoad.
Il faut déplacer le code comme ci-suivant :
En plus, il ne faut pas 'override' la méthode initWithNibName:bundle:
Si ce code ne marche pas, c'est comment que tu crées le viewController ?
Peut-être plus facile - mettre en place et connecter le gesture recognizer au viewController dans le XIB
Merci à tous de vos réponses
Un point que je n'avais pas précisé : je n'utilise pas de fichier xib. La vue est entièrement construite de manière programmatique (pas de storyboard dans mon projet).
Je n'utilise pas le delegate dans cette exemple mais je vais devoir l'implémenter pour reconnaitre des gestes qui ont des débuts communs (swipe/pan).
Quand à vos remarques sur le fait d'overwriter le initWithNibName, je ne comprends pas bien ce que cela change.
En tout état de cause le code que j'ai publié fonctionne. Je posterais les améliorations en suivant.
Un grand merci à tous.
seb
Donner des noms adéquat aux méthodes/classes/... est très important. Comme son nom l'indique le initWithNibName:.... est un init de la classe UIViewController avec un xib, le nibName comme paramètre. Si tu mets ce code, le prochain qui va lire ton code vas comprendre que tu utilises un xib pour ta vue alors que non. Y en a même qui disent que il ne faut jamais appeler cet init en dehors de sa classe, mais ça c'est une autre histoire.
Si tu veux créer ta vue avec du code, il faut surcharger la méthode - (void)loadView de UIViewController.
et mettre la logique de gesture dans le viewDidLoad.
https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/loadView
@iLandes : vu que ta classe ne contient pas de xib, je pense que c'est pour cela que ça ne marchait pas : la méthode - viewDidLoad n'était peut-être jamais appelée.
Je veins de finir la gestion des gestes de ma classe.
Pour ceux que cela peut aider
Voici un extrait du .h
Voici un extrait du .m
Un grand merci à tous les contributeurs de ce post
seb
Quelques petites corrections...
C'est très important que tu ne fais pas ce que tu as proposé 8--)
Serait-ce absurde de faire
?
Non seulement absurde, c'est contre les directions d'Apple ::)
Si tu l'appelles dans ton init :
- Non seulement ça va appeler une méthode qui est normalement appelée automatiquement par le VC et seulement dans un certain contexte alors que là tu l'appelles hors de contexte (c'est un peu la même erreur que si tu appelais drawRect: toi même sur une UIView ce qu'il ne faut jamais faire car drawRect est appelé automatiquement et surtout à un moment précis de la phase de refresh d'UI de la RunLoop, en ayant créé lui-même le contexte graphique auparavant, etc, donc à ne jamais appeler soi-même)
- Mais en plus et surtout ça va charger la vue bien trop tôt, dès l'init, alors que non seulement ce n'est pas nécessaire mais surtout ça ne respecte pas le pattern de lazy-loading mis en place par les VC et qui en font entre autres tout leur intérêt.
Un VC ne charge sa vue tout seul que quand c'est nécessaire, pas avant.