Come annullare una sequenza di eventi UITouch?

voti
20

Ho un UIImagevista che risponde al tatto eventi. Voglio cancellare la sequenza di tocco, vale a dire, ulteriori chiamate verso touchesMoved:, se il tocco va al di fuori di certi limiti. Come lo posso fare?

So che in touchesMoved:posso ispezionare le coordinate dell'oggetto tatto e ignorarlo, ma quello che non so è come annullare la sequenza del tutto. Non vedo alcun metodo documentato nel Apple Developer UIResponderdi riferimento che posso chiamare per annullare una sequenza di tocco.

È pubblicato 10/02/2009 alle 19:37
fonte dall'utente
In altre lingue...                            


12 risposte

voti
6

Questa soluzione può essere un po 'kludgy, ma si potrebbe implementare e chiamare manualmente

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

Sto basando questa soluzione liberamente su qualche ritocco che ho fatto per il campione app moveme su Apple codice di esempio iPhone sito in cui ho modificato il touchesMovedmetodo per assomigliare a questo:

- (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;
}
Risposto il 10/02/2009 a 20:51
fonte dall'utente

voti
3

Prova temporanea impostando la proprietà userInteractionEnabled del UIImageView NO

Risposto il 28/11/2011 a 04:30
fonte dall'utente

voti
3

È necessario chiamare [super touchesMoved:withEvent:]in modo da permettere la vista eccellente ripulire dalla manifestazione ma ancora più importante, è necessario non chiamare [super touchesCancelled:withEvent:].

Ecco quello che ho usato su una cella per tenerlo da ottenere selezionato quando ho rilevato un colpo:

- (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];
    }
}
Risposto il 13/05/2010 a 01:50
fonte dall'utente

voti
2

Non credo che sia possibile, perché io non lo vedo documentato e nessuna di queste soluzioni funziona.

Risposto il 21/11/2011 a 05:23
fonte dall'utente

voti
2

Ho affrontato lo stesso problema da poco e ha trovato un modo standard per risolverlo. È possibile utilizzare [[UIApplication sharedApplication] beginIgnoringInteractionEvents] per interrompere l'erogazione di eventi touchesMoved per tutta la vostra applicazione. Assicurati di consentire loro utilizzando [[UIApplication sharedApplication] endIgnoringInteractionEvents] quando si ha bisogno di ricevere di nuovo tocchi.

Risposto il 05/04/2010 a 10:30
fonte dall'utente

voti
1

Ho raggiungere questo rimuovendo la vista dalla sua superview e aggiungendo subito indietro.

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

Questo rompe la catena responder alla vista così ogni residuo tocchi non verranno ricevuti nella vista. Il tocco prossimo sarà ancora essere ricevuto come normale.

Risposto il 03/08/2016 a 10:44
fonte dall'utente

voti
1

Questo codice vi aiuterà. A disattivare evento di tocco nel touchesMoved:metodo e sto consentendo evento di tocco in touchesCancelled:metodo

-(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];
}
Risposto il 21/08/2014 a 11:31
fonte dall'utente

voti
1

soluzione "forza bruta" a seconda se si adatta alle vostre esigenze: rimuovere e ri-inizializzare il visualizzazione secondaria che riceve il tocco o risponde a loro (naturalmente prendersi cura di telaio e contenuti).

Risposto il 24/03/2013 a 21:56
fonte dall'utente

voti
0

Stavo solo cercando di risolvere qualcosa di simile, e ha scoperto che nessuna delle soluzioni elencate lei ha lavorato per me. Il meglio che ho potuto gestire stava ignorando temporaneamente i tocchi, ma poi si riprende, quando il touch rientrato la vista.

Infine risolto.

  1. Impostare un flag booleano chiamato "disabile"
  2. In touchedMoved, controllare che il tocco è all'interno della vista desiderata. Se non lo è, impostare il flag disabile su YES.
  3. Sempre in in touchedMoved, controllare il flag prima di eseguire l'azione. Quindi, a questo punto, non accadrà nulla se sono al di fuori della vista.
  4. In touchesEnded, impostare il flag disabile su NO. Quindi la sequenza tocco è effettivamente fermato fino utente solleva il dito.

Credo che questo funzionerà per voi se non avete un motivo specifico per letteralmente bisogno la sequenza tocco annullata.

Risposto il 13/01/2013 a 15:41
fonte dall'utente

voti
0

Su iOS5 sembra che ci sia un metodo privato in UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

A seconda della implementazione di Apple potrebbe interrompere l'invio di eventi

Un altro modo di fare così sarebbe utilizzando oggetti associativi

- (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);
    }
}
Risposto il 25/11/2011 a 19:44
fonte dall'utente

voti
-1

È possibile creare categorie di UITouch. Si può dichiarare

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

E quando si cambia touch.view a zero, per esempio, è possibile simulare fine del dispacciamento eventi di tocco

Risposto il 17/04/2013 a 20:43
fonte dall'utente

voti
-2

È possibile verificare che le posizioni dei punti di contatto sono a CGRect (es. I punti sono nel rettangolo del vostro ImageView) oppure no. Se non sono in quel Rect, il tocco verrà annullata.

-(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];
     }
 }
Risposto il 24/11/2011 a 06:44
fonte dall'utente

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