Utilisation de UILongPressGestureRecognizer pour les sous-vues de UIScrollview

Au cours des quatre dernières heures, j'ai essayé de nombreuses solutions Stack Overlow, mais aucune n'a aidé à résoudre mon problème.

C'est ici,

Toutefois, si je remplace le parpath par des sous-vues de défilement, l'événement de presse longue ne se triggers jamais.

  1. Comment détecter une pression longue sur une sous-vue d'une vue défilée?
  2. Cependant, comme je peux détecter de longues pressions sur une vue défilante, il est possible de détecter la position de la presse pour voir quelle sous-vue spécifique est pressée.

En outre, (insert subview here).userInteractionEnabled = YES , j'ai mis cette propriété pour tous mes sous-vues de la vue de défilement, donc cela ne devrait pas être un problème.

J'ai également essayé d'utiliser la méthode touchesBegan et touchEnded comme suggéré ailleurs dans Stack Overflow.

En outre, pour les vues d'image, je mets un nouveau UILongPressGestureRecognizer pour chaque vue d'image personnalisée, en utilisant une boucle for, car je suis conscient de la règle de 1 vue par reconnaissance de mouvement .

D'un développeur iOS pour la première fois,

Graham

PS Je préférerais vraiment si je pouvais find une solution pour 1. plutôt que le désordre 2.


Plus de code comme demandé:

Init de la vue Contrôleur

  UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; longPress.minimumPressDuration = 0.5; [self.titleLabel addGestureRecognizer:longPress]; //titleLabel property initialized elsewhere [mainView addSubview:self.titleLabel]; 

Dans une méthode de "chargement d'images"

 for (NSData * dataImg in results) { //Does some work turning data into an image, into an image view called img img.delegate = self; img.userInteractionEnabled = YES; UILongPressGestureRecognizer *aLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; aLongPress.minimumPressDuration = 0.5; [img addGestureRecognizer:aLongPress]; [imgContainer addSubview:img]; } 

Encore plus de code + notes

self.view (UIView)

-> scroll (UIScrollView)

-> -> mainView (UIView)

-> -> -> titleLabel (UILabel)

-> -> -> imgContainer (UIView)

-> -> -> -> images (UIImageViews)

 [self.view addSubview:scroll]; [scroll addSubview:mainView]; [mainView addSubview:self.titleLabel]; [mainView addSubview:imgContainer]; [imgContainer addSubview:img]; //done 8x via for loop 

Merci à la réponse de @ RegularExpression, je suis maintenant conscient que la mainView est pressé, mais pas ses sous-vues, donc je dois find un moyen d'afficher les sous-vues de mainView ci-dessus. 🙂

Une autre mise à jour, titleLabel fonctionne. ImageViews ne fonctionne toujours pas. 🙁

Je sais que c'est un peu en retard et une réponse a été choisie, mais au cas où quelqu'un d'autre voudrait une solution simple si vous avez iOS7.

Dans votre délégué de UILongPressGestureRecognizer, implémentez le gestureRecognizer: shouldRequireFailureOfGestureRecognizer: otherGestureRecognizer selector

Vérifiez si otherGestureRecognizer est un UIPanGestureRecognizer et renvoyez YES, sinon renvoyez NO

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { return YES; } return NO; } 

La vue déroulante produira en fait un UIScrollViewPanGestureRecognizer, qui fait partie de l'API privée, mais il s'agit d'une sous-class de UIPanGestureRecognizer donc ce qui précède fonctionne correctement.

Pour prendre en charge iOS6 ou une version plus récente, vous devez parcourir le programme gestureRecognizers de UIScrollView, détecter celui qui est UIPanGestureRecognizer et exécuter le sélecteur requireGestureRecognizerToFail sur votre UILongPressGestureRecogizer avec cela.

Étant donné que votre UIScrollView est le parent commun, c'est probablement là que doit se find votre outil de reconnaissance de gestes. Vous pouvez déterminer quelle sous-vue est pressée en regardant l'location du point fourni dans votre action. Ainsi, les sous-vues individuelles n'ont pas besoin de reconnaissance de gestes.

Donc, vous feriez quelque chose comme ça:

 - (void)longPressDidFire:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateEnded) CGPoint point = [sender locationInView:scroll]; UIView *tappedView = [scroll hitTest:point withEvent:nil]; 

Donc, alors vous avez l'opinion qui a été longtime pressé.

D'autres choses qui pourraient faire que l'action ne se triggers pas seraient un problème de délégué ou si le défilement est contenu par une autre vue qui intercepte le contact.

HTH

Votre code semble aller bien, il devrait fonctionner je pense.J'ai utilisé ci-dessous le code et son fonctionnement bien pour moi.

 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; longPress.delegate = (id)self; longPress.minimumPressDuration=0.05; imageView.userInteractionEnabled = YES; [imageView addGestureRecognizer:longPress]; 

et sa méthode,

 - (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender { NSLog(@"detected"); if (sender.state == UIGestureRecognizerStateEnded){ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"YES" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [alert show]; } } 

Ici, j'ai pris imageView comme sous-vue de scrollview comme vous l'avez dit

Au lieu de

  [scroll addGestureRecognizer:longPress]; 

Ajoutez le geste à vos sous-vues, juste après les avoir déclarées et avant de les append à scrollview

  [subview addGestureRecognizer:longPress]; 

Woohoo ça marche!

Le problème était:

imgContainer était un UIView avec un cadre vide avec plusieurs UIImageViews comme sous-vues

J'avais l'printing que lorsque j'ajoutais une sous-vue à imgContainer, imgContainer se développait .

Ce n'est pas vrai .

J'ai dû mettre l'image de imgContainer dans le même cadre de contenu que la vue défilement et tout est devenu correct.

J'espère que cette réponse sera utile à tous les autres futurs chronométreurs iOS comme moi.