Cum de a anula o succesiune de evenimente UITouch?

voturi
20

Am o UIImagevizualizare care răspunde la atingere evenimente. Vreau să anuleze secvența de atingere, de exemplu, solicită în continuare la touchesMoved:, în cazul în care atingerea merge în afara anumitor limite. Cum pot face acest lucru?

Știu că în touchesMoved:eu pot inspecta coordonatele obiectului tactil si ignora - l, dar ceea ce nu știu este cum de a anula secvența cu totul. Nu văd nici o metodă documentată în Apple a Developer UIResponderReference care pot apela pentru a anula o secvență de atingere.

Întrebat 10/02/2009 la 19:37
sursa de către utilizator
În alte limbi...                            


12 răspunsuri

voturi
6

Această soluție poate fi un pic kludgy, dar ai putea pune în aplicare și de apel manual

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

Sunt bazându această soluție vag unele optimizări am făcut app eșantion CIRCULAȚIE pe Apple cod de probă pentru iPhone site - ul în cazul în care am modificat touchesMovedmetoda de a arata astfel:

- (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;
}
Publicat 10/02/2009 la 20:51
sursa de către utilizator

voturi
3

Încercați temporar setarea de proprietate userInteractionEnabled UIImageView a NO

Publicat 28/11/2011 la 04:30
sursa de către utilizator

voturi
3

Ai nevoie de a apela [super touchesMoved:withEvent:]pentru a permite vizualizarea super - curat de la eveniment , dar mai important, trebuie să nu suni [super touchesCancelled:withEvent:].

Iată ce am folosit pe o celulă să-l păstrați de la obtinerea ales când am detectat o glisează:

- (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];
    }
}
Publicat 13/05/2010 la 01:50
sursa de către utilizator

voturi
2

Nu cred că e posibil, pentru că nu văd documentat și nici una dintre aceste soluții funcționează.

Publicat 21/11/2011 la 05:23
sursa de către utilizator

voturi
2

M-am confruntat cu aceeași problemă recent și a găsit o modalitate standard de a rezolva problema. Puteți utiliza [[UIApplication sharedApplication] beginIgnoringInteractionEvents] pentru a opri livrarea de evenimente touchesMoved pentru întreaga aplicație. Asigurați-vă că pentru a le permite utilizarea [[UIApplication sharedApplication] endIgnoringInteractionEvents] atunci când aveți nevoie pentru a primi din nou atinge.

Publicat 05/04/2010 la 10:30
sursa de către utilizator

voturi
1

Am realiza acest lucru prin eliminarea din punctul de vedere Superview sale și adăugându-l drept înapoi.

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

Acest lucru se rupe lanțul de răspuns la vizualizarea astfel încât orice atingeri rămase nu vor fi primite pe ecranul. Următoarea atingere va fi în continuare primite în mod normal.

Publicat 03/08/2016 la 10:44
sursa de către utilizator

voturi
1

Acest cod vă va ajuta. Dezactivez eveniment atingere în touchesMoved:metoda și eu să permită eveniment atingere în touchesCancelled:metoda

-(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];
}
Publicat 21/08/2014 la 11:31
sursa de către utilizator

voturi
1

soluție „Forța brută“, în funcție de cazul în care se potrivește nevoilor dumneavoastră: Scoateți și re-inițializa subview care primește atinge sau răspunde la ele (desigur, să aibă grijă de cadru și de conținut).

Publicat 24/03/2013 la 21:56
sursa de către utilizator

voturi
0

Am fost doar încercarea de a rezolva ceva de genul asta, și a constatat că niciuna dintre soluțiile enumerate ea a lucrat pentru mine. Cel mai bun am putut gestiona a fost ignorând temporar atinge, dar apoi au reluat atunci când atingerea reintrat vizualizarea.

În cele din urmă rezolvat.

  1. Configurarea un steag boolean numit „dezactivat“
  2. În touchedMoved, verificați mai întâi că atingerea este în interiorul vizualizarea dorită. Dacă nu este, setați pavilion dezactivat la YES.
  3. Încă în touchedMoved, verificați de pavilion înainte de efectuarea acțiunii tale. Deci, în acest moment, nimic nu se va întâmpla în cazul în care acestea sunt în afara ecranului.
  4. În touchesEnded, setați pavilion dezactivat la NO. Deci secvența de atingere este oprită în mod eficient până când utilizatorul ridică degetul lor.

Cred că acest lucru va lucra pentru tine, dacă nu aveți un motiv specific pentru a avea nevoie de literalmente secvența de atingere a anulat.

Publicat 13/01/2013 la 15:41
sursa de către utilizator

voturi
0

Pe iOS5 pare a fi o metodă privată în UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

În funcție de punerea în aplicare Apple ar putea opri trimiterea de evenimente

Un alt mod de a face acest lucru ar fi folosind obiecte asociative

- (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);
    }
}
Publicat 25/11/2011 la 19:44
sursa de către utilizator

voturi
-1

Puteți crea categorie la UITouch. Aveți posibilitatea să declare

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

Iar atunci când schimbați touch.view la zero, de exemplu, puteți simula sfârșitul de dispecerizare evenimente tactile

Publicat 17/04/2013 la 20:43
sursa de către utilizator

voturi
-2

Puteți verifica faptul că, locațiile punct de contact se află în CGRect ( de ex. , Punctele sunt în dreptunghiul de ImageView dvs.) sau nu. În cazul în care acestea nu sunt în această Rect, atingere va fi anulată.

-(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];
     }
 }
Publicat 24/11/2011 la 06:44
sursa de către utilizator

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