Jak anulować sekwencję zdarzeń UITouch?

głosy
20

Mam UIImagewidok, który reaguje na dotyk wydarzenia. Chcę anulować sekwencję dotykowego, czyli kolejnych wywołań touchesMoved:, jeśli wykracza poza dotknięcie pewnych granicach. Jak mogę to zrobić?

Wiem, że touchesMoved:mogę sprawdzać współrzędne obiektu dotykowym i ignorować go, ale co nie wiem, jest to, jak anulować sekwencję całkowicie. Nie widzę żadnej metody udokumentowany w programisty firmy Apple UIResponderReference , że mogę zadzwonić do anulować sekwencję dotykowego.

Utwórz 10/02/2009 o 19:37
źródło użytkownik
W innych językach...                            


12 odpowiedzi

głosy
6

To rozwiązanie może być nieco kludgy, ale można wdrożyć i ręcznie zadzwonić

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

Ja tego rozwiązania bazując luźno na jakimś szczypanie zrobiłem próbki aplikacji moveme na Apple iPhone Przykładowy kod miejscu gdzie zmodyfikował touchesMovedmetodę wyglądać następująco:

- (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;
}
Odpowiedział 10/02/2009 o 20:51
źródło użytkownik

głosy
3

Spróbuj tymczasowe ustawienie właściwości userInteractionEnabled UIImageView do NO

Odpowiedział 28/11/2011 o 04:30
źródło użytkownik

głosy
3

Trzeba zadzwonić [super touchesMoved:withEvent:], aby pozwolić super widok oczyścić z imprezy, ale co ważniejsze, trzeba nie zadzwonić [super touchesCancelled:withEvent:].

Oto, co kiedyś na komórce, aby utrzymać go z coraz wybrany kiedy wykrył bezstykowa:

- (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];
    }
}
Odpowiedział 13/05/2010 o 01:50
źródło użytkownik

głosy
2

Nie sądzę, że to możliwe, ponieważ nie widzę to udokumentowane, a żadna z tych rozwiązań nie działa.

Odpowiedział 21/11/2011 o 05:23
źródło użytkownik

głosy
2

Mam ten sam problem w obliczu niedawno i okazało się standardowy sposób rozwiązywać je. Można użyć [[UIApplication sharedApplication] beginIgnoringInteractionEvents], aby przerwać dostarczanie zdarzeń touchesMoved do całej aplikacji. Upewnij się, aby włączyć je za pomocą [[UIApplication sharedApplication] endIgnoringInteractionEvents], gdy trzeba ponownie odbierać poprawki.

Odpowiedział 05/04/2010 o 10:30
źródło użytkownik

głosy
1

I to osiągnąć poprzez usunięcie widoku z jej SuperView i dodanie go prosto.

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

To przerywa łańcuch reagował na widok więc wszelkie pozostałe detale nie będą odbierane na widoku. Kolejny dotykowy nadal będą odbierane jako normalne.

Odpowiedział 03/08/2016 o 10:44
źródło użytkownik

głosy
1

Ten kod pomoże. Wyłączyć dotykowy zdarzenie w touchesMoved:metodzie a ja umożliwiające dotykowy zdarzenie w touchesCancelled:metodzie

-(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];
}
Odpowiedział 21/08/2014 o 11:31
źródło użytkownik

głosy
1

rozwiązanie „brute force” w zależności czy to odpowiada Twoim potrzebom: Wyjmij i ponownie zainicjować podrzędny, który odbiera ostatnie poprawki lub reaguje na nich (oczywiście dbać o ramki i zawartości).

Odpowiedział 24/03/2013 o 21:56
źródło użytkownik

głosy
0

Ja tylko próbuje rozwiązać coś takiego, i okazało się, że żaden z wymienionych rozwiązań niej pracował dla mnie. Najlepszym mogę zarządzać został tymczasowo ignorując akcenty, ale potem wznowiono gdy dotyk ponownie wszedł do widoku.

Ostatecznie rozwiązany.

  1. Ustawić flagę logiczną nazwie „wyłączone”
  2. W touchedMoved, najpierw sprawdza, czy dotyk jest wewnątrz żądanego widoku. Jeśli tak nie jest, należy ustawić wyłączoną flagę Tak.
  3. Wciąż w touchedMoved sprawdzić flagę przed wykonaniem swoje działania. Tak, w tym momencie, nic się nie stanie, jeśli są poza widokiem.
  4. W touchesEnded ustaw wyłączoną flagę NO. Więc dotyk sekwencja jest skutecznie zatrzymała aż użytkownik podniesie ich palcem.

Myślę, że to będzie pracować dla Ciebie, chyba że masz konkretny powód dosłownie konieczności dotykowego sekwencję anulowane.

Odpowiedział 13/01/2013 o 15:41
źródło użytkownik

głosy
0

Na iOS5 nie wydaje się być prywatna metoda UITouch

-(void)setSentTouchesEnded:(BOOL)ended;

W zależności od implementacji Apple mogło zatrzymać wysyłanie zdarzeń

Innym sposobem robić to będzie za pomocą asocjacyjne obiektów

- (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);
    }
}
Odpowiedział 25/11/2011 o 19:44
źródło użytkownik

głosy
-1

Możesz stworzyć własną kategorię do UITouch. Można zadeklarować

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

I po zmianie touch.view do zera, na przykład, można symulować koniec wysyłania zdarzeń dotykowych

Odpowiedział 17/04/2013 o 20:43
źródło użytkownik

głosy
-2

Można sprawdzić, że lokalizacje punktu próbkowania są w CGRect (tj. Punkty w prostokącie swojej ImageView) lub nie. Jeśli nie są one w tym Rect, dotyk zostanie anulowane.

-(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];
     }
 }
Odpowiedział 24/11/2011 o 06:44
źródło użytkownik

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