Comment annuler une séquence d'événements UITouch?

voix
20

J'ai UIImagevue qui répond au toucher des événements. Je veux annuler la séquence tactile, à savoir, d' autres appels à touchesMoved:, si le contact passe en dehors de certaines limites. Comment puis je faire ça?

Je sais que touchesMoved:je peux vérifier les coordonnées de l'objet tactile et l' ignorer, mais ce que je ne sais pas comment annuler est la séquence tout à fait. Je ne vois aucune méthode documentée dans le Apple Developer UIResponderréférence que je peux appeler pour annuler une séquence tactile.

Créé 10/02/2009 à 19:37
source utilisateur
Dans d'autres langues...                            


12 réponses

voix
6

Cette solution peut être un peu kludgy, mais vous pouvez mettre en œuvre et appeler manuellement

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

Je fonde cette solution vaguement sur quelques ajustements , je l'ai fait à l'exemple d' application sur MoveMe d'Apple exemple iPhone Code site où j'ai modifié la touchesMovedméthode pour ressembler à ceci:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch *touch = [touches anyObject];
     if ([touch view] == placardView)
         CGPoint location = [touch locationInView:self];
         placardView.center = location;
         // I added the following line:
         [self touchesCancelled:touches withEvent:event];
         return;
}
Créé 10/02/2009 à 20:51
source utilisateur

voix
3

Essayez de régler temporairement la propriété userInteractionEnabled du UIImageView NO

Créé 28/11/2011 à 04:30
source utilisateur

voix
3

Vous devez appeler [super touchesMoved:withEvent:]afin de laisser le super vue de nettoyer l'événement , mais plus important encore , vous avez besoin de ne pas appeler [super touchesCancelled:withEvent:].

Voici ce que j'ai utilisé sur une cellule pour l'empêcher de se faire quand je choisis un simple glissement détecté:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) {
            RESPOND_TO_SWIPE
            showingEdit = YES;
            [super touchesCancelled:touches withEvent:event];
        } else {
            [super touchesMoved:touches withEvent:event];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!showingEdit) {
        [super touchesEnded:touches withEvent:event];
    }
}
Créé 13/05/2010 à 01:50
source utilisateur

voix
2

Je ne pense pas qu'il soit possible parce que je ne vois pas documenté et aucune de ces solutions fonctionnent.

Créé 21/11/2011 à 05:23
source utilisateur

voix
2

Je l'ai fait face au même problème récemment et a trouvé un moyen standard pour le résoudre. Vous pouvez utiliser [[UIApplication sharedApplication] beginIgnoringInteractionEvents] pour cesser de livrer des événements touchesMoved à votre application entière. Assurez-vous de les activer en utilisant [[UIApplication sharedApplication] endIgnoringInteractionEvents] lorsque vous avez besoin de recevoir à nouveau des touches.

Créé 05/04/2010 à 10:30
source utilisateur

voix
1

Je réalise cela en supprimant la vue de son superview et ajoutant dos droit.

[view retain];
UIView *sv = view.superview;
[view removeFromSuperview];
[sv addSubview:view];
[view release];

Cela rompt la chaîne de répondeur à la vue de sorte que toute touche restants ne seront pas reçus à la vue. La touche suivante sera toujours reçu normalement.

Créé 03/08/2016 à 10:44
source utilisateur

voix
1

Ce code vous aidera. Désactiver événement tactile en touchesMoved:méthode et j'InterActions pour événement tactile en touchesCancelled:méthode

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     UITouch *touch = [touches anyObject];
     .......
     .......
     Your code
     .......
     .......

     //Condition when you want to disable touch event

     [[UIApplication sharedApplication] beginIgnoringInteractionEvents];

     .......
     .......
     Your code
     .......
     .......
 }


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}
Créé 21/08/2014 à 11:31
source utilisateur

voix
1

solution « force brute » en fonction si elle répond à vos besoins: supprimer et initialiser le sous-vue qui reçoit les touches ou y répond (bien sûr prendre soin du cadre et du contenu).

Créé 24/03/2013 à 21:56
source utilisateur

voix
0

Je voulais juste essayer de résoudre quelque chose comme ça, et a constaté que aucune des solutions elle a travaillé pour la liste moi. Le mieux que je pouvais gérer temporairement ne tenait pas compte des touches, mais ils ont repris lorsque la touche à nouveau entré dans la vue.

Enfin résolu.

  1. Mettre en place un drapeau booléen appelé « désactivé »
  2. Dans touchedMoved, d'abord vérifier que le contact est à l'intérieur de la vue souhaitée. Dans le cas contraire, réglez le drapeau désactivé YES.
  3. Toujours dans dans touchedMoved, vérifiez le drapeau avant d'effectuer votre action. Donc, à ce stade, rien ne se passera si elles sont en dehors de la vue.
  4. Dans touchesEnded, définissez l'indicateur désactivé NO. Ainsi, la séquence tactile est effectivement interrompue jusqu'à ce que l'utilisateur lève le doigt.

Je suppose que cela fonctionnera pour vous à moins que vous ayez une bonne raison pour avoir besoin littéralement la séquence touche annulée.

Créé 13/01/2013 à 15:41
source utilisateur

voix
0

Sur iOS5 il semble y avoir une méthode privée dans UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

En fonction de la mise en œuvre de la pomme, il pourrait cesser d'envoyer des événements

Une autre façon de faire serait donc l'utilisation d'objets associatifs

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue])
        return;
    if (sometouchisoutsideofview) {
        objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN);
    }
}
Créé 25/11/2011 à 19:44
source utilisateur

voix
-1

Vous pouvez créer la catégorie à UITouch. Vous pouvez déclarer

@property (nonatomic,strong,readwrite) UIView *view;

Et quand vous changez touch.view à zéro, par exemple, vous pouvez simuler fin de la distribution des événements tactiles

Créé 17/04/2013 à 20:43
source utilisateur

voix
-2

Vous pouvez vérifier que les emplacements des points tactiles sont en CGRect ( à savoir les points. Sont dans le rectangle de votre imageview) ou non. Si elles ne sont pas dans ce Rect, la touche sera annulée.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self.view];

    if (CGRectContainsPoint(myImageView, touchLocation))
    {
       lastPoint = [touch locationInView: myImageView];
    }

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y);   
  }

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
 {
  CGPoint currentPoint;
  UITouch *touch = [touches anyObject];
  CGPoint touchLocation = [touch locationInView:self.view];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
       currentPoint = [touch locationInView: myImageView];
     }
 }
Créé 24/11/2011 à 06:44
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more