2010-10-14 3 views
45

Mam UIPanGestureRecognizer używam do śledzenia obiektu (UIImageView) poniżej palca użytkownika. Dbam tylko o ruch na osi X, a jeśli dotyk odchodzi powyżej lub poniżej ramy obiektu na osi Y, chcę zakończyć dotyk.Jak mogę poinformować UIGestureRecognizer, aby anulował istniejący dotyk?

Mam wszystko, czego potrzebuję do określenia, czy dotyk znajduje się w granicach Y obiektu, ale nie wiem, jak anulować zdarzenie dotykowe. Przeglądanie właściwości rozpoznawacza cancelsTouchesInView wydaje się nie robić tego, co chcę.

Dzięki!

Odpowiedz

139

Ta mała sztuczka działa dla mnie.

@implementation UIGestureRecognizer (Cancel) 

- (void)cancel { 
    self.enabled = NO; 
    self.enabled = YES; 
} 

@end 

Z dokumentacji UIGestureRecognizer @enabled:

wyłącza rozpoznawania, czyli recognizers gest więc nie otrzyma akcenty. Domyślna wartość to TAK. Jeśli zmienisz tę właściwość na NIE, podczas gdy gest rozpoznawania rozpoznaje obecnie gest , rozpoznawanie gestów przechodzi w stan anulowany.

+2

PO wydaje się być pytanie o anulowaniu osobnika dotknij gestu, nie zabijając całkowicie gestu. –

+0

Przyjemne minimalne rozwiązanie –

+1

Technika ta jest zalecana w [sesji WWDC 2014 235: Zaawansowane techniki przewijania i techniki dotykowe] (https://developer.apple.com/videos/wwdc/2014/?id=235). –

1

masz kilka sposobów obsługi to:

  1. Jeśli zostały pisanie zwyczaj pan gest Rozpoznawania podklasy, można łatwo to zrobić dzwoniąc -ignoreTouch:withEvent: od wewnątrz rozpoznawania gdy zauważysz, że błądzą z obszaru, na którym ci zależy.

  2. Ponieważ używasz standardowego Pan rozpoznawania i dotyku zaczyna OK (tak, że nie chcesz, aby zapobiec jej z funkcji delegata), naprawdę można zrobić tylko swoje wyróżnienie po pojawieniu się działania docelowe modułu rozpoznawania. Sprawdź wartość Y dla wartości zwracanych translationInView: lub locationInView: i odpowiednio ją zacisnij.

+2

chodzi o to, w jaki sposób ignorujesz rozpoznawcę i przekazujesz zdarzenia dotykowe innym w jego działaniu? – Jack

3

Jak o tym od apple docs:

@property(nonatomic, getter=isEnabled) BOOL enabled 

wyłącza rozpoznawania, czyli recognizers gest tak nie otrzyma akcenty. Domyślna wartość to TAK. Jeśli zmienisz tę właściwość na NIE, podczas gdy urządzenie rozpoznające gest rozpoznaje gest, to narzędzie do rozpoznawania gestów przejdzie w stan anulowania.

8

@ odpowiedź matej w Swift.

extension UIGestureRecognizer { 
    func cancel() { 
    isEnabled = false 
    isEnabled = true 
    } 
} 
5

Obj-C:

recognizer.enabled = NO; 
recognizer.enabled = YES; 

Swift 3:

recognizer.isEnabled = false 
recognizer.isEnabled = true 
0

Zgodnie z dokumentacją można podklasy ci gest rozpoznającym:

W YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h" 

@implementation YourPanGestureRecognizer 

- (void) cancelGesture { 
    self.state=UIGestureRecognizerStateCancelled; 
} 

@end 

W YourPanGestureRecognizer.h:

#import <UIKit/UIKit.h> 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface NPPanGestureRecognizer: UIPanGestureRecognizer 

- (void) cancelGesture; 

@end 

Teraz można zadzwonić, jeśli z dowolnego

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; 
[self.view addGestureRecognizer:panRecognizer]; 
[...] 
-(void) panMoved:(YourPanGestureRecognizer*)sender { 
    [sender cancelGesture]; // This will be called twice 
} 

Ref: https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc