2013-02-01 21 views
7

Piszę program Objective-C dla iPhone'a.UILongPressGestureRecognizer nie odpowie na dotyk i zatrzyma

Próbuję wdrożyć UILongPressGestureRecognizer i nie mogę go uruchomić tak, jak chcę.

Co Chcę zrobić jest prosta:

Reakcja na dotyk będącego odbyło dół ekranu.

UILongPressGestureRecognizer działa dobrze, gdy dotyk się porusza i zaczyna się dotyk, ale jeśli przytrzymam go w tym samym miejscu, nic się nie dzieje.

Dlaczego?

Jak radzić sobie z dotknięciem początku, nie ruszaniem się i pozostaniem w tym samym miejscu?

Oto mój obecny kod.


// Configure the press and hold gesture recognizer 
touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(touchAndHold:)]; 
touchAndHoldRecognizer.minimumPressDuration = 0.1; 
touchAndHoldRecognizer.allowableMovement = 600; 
[self.view addGestureRecognizer:touchAndHoldRecognizer]; 
+0

// Konfiguruj funkcję rozpoznawania gestów naciśnij i przytrzymaj touchAndHoldRecognizer = [[Przypisanie UILongPressGestureRecognizer] initWithTarget: self action: @selector (touchAndHold :)]; touchAndHoldRecognizer.minimumPressDuration = 0,1; touchAndHoldRecognizer.allowableMovement = 600; [self.view addGestureRecognizer: touchAndHoldRecognizer]; –

+0

Dokładnie. Nie otrzymasz powtarzających się wydarzeń, jeśli się nie poruszysz. Właśnie to próbuję naprawić. Czy znasz metodę, dzięki której mogę się powtarzać, jeśli się nie ruszę? –

+2

To powinno być ponownie otwarte, ponieważ jeśli przyjrzysz się uważnie temu, o co pytasz, nie pytasz "jak mam wykonać długi gest", ale raczej "teraz otrzymuję powiadomienia w trakcie długiego naciśnięcia klawisza, nawet chociaż się nie ruszam. " To nie jest duplikat tego drugiego pytania. – Rob

Odpowiedz

12

opisać zachowanie, gdzie gest rozpoznawania nie otrzyma dalszych połączeń do obsługi, gdy nie jest standardem ruchomego zachowanie. Właściwość state dla tych gestów podczas przenoszenia jest typu UIGestureRecognizerStateChanged, więc ma sens, że jeśli rzeczy nie uległy zmianie, twój program obsługi nie zostanie wywołany.

mogli Państwo

  • Po wywołaniu swojej rozpoznawania gest state z UIGestureRecognizerStateBegan rozpocząć powtarzający stoper;
  • Po wywołaniu aparatu do rozpoznawania gestów za pomocą z UIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed lub UIGestureRecognizerStateEnded następnie invalidate i zwolnij timer;
  • Upewnij się, że metoda gest rozpoznawania zapisuje cokolwiek wartość szukasz w niektórych właściwości klasy (np wartość locationInView lub cokolwiek)

Więc może coś takiego:

@interface ViewController() 

@property (nonatomic) CGPoint location; 
@property (nonatomic, strong) NSTimer *timer; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
    gesture.minimumPressDuration = 0.1; 
    gesture.allowableMovement = 600; 
    [self.view addGestureRecognizer:gesture]; 
} 

- (void)handleTimer:(NSTimer *)timer 
{ 
    [self someMethod:self.location]; 
} 

- (void)handleGesture:(UIGestureRecognizer *)gesture 
{ 
    self.location = [gesture locationInView:self.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
    } 
    else if (gesture.state == UIGestureRecognizerStateCancelled || 
      gesture.state == UIGestureRecognizerStateFailed || 
      gesture.state == UIGestureRecognizerStateEnded) 
    { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 

    [self someMethod:self.location]; 
} 

- (void)someMethod:(CGPoint)location 
{ 
    // move whatever you wanted to do in the gesture handler here. 

    NSLog(@"%s", __FUNCTION__); 
} 

@end 
+0

... Myślę, że zaczynam to rozumieć. Mój problem polegał na tym, że nie rozumiałem metodologii Apple'a, jak radzą sobie z dotknięciami. Myślę, że powodem, dla którego spędziłem 4 godziny na szukaniu odpowiedzi w Internecie i coraz bardziej sfrustrowanym, jest brak punktu.Pomogłeś mi zobaczyć tego Roba. W Cocoa nie ma metody podobnej do "handleTouchesRemainedStationary", ponieważ jeśli dotyk się nie zakończył i się nie poruszył ... Wtedy __oczywiście__ pozostało takie samo. Możesz kontynuować iterację w pętli wykonawczej. Dzięki, Rob! –

+0

@ J-Rock Cool. Twoja implementacja może być różna (możesz na przykład zresetować licznik czasu po gestach, więc nie otrzymasz wywołań czasowych, jeśli się poruszasz), ale wpadłeś na pomysł. FYI, trochę uprościłem swój kod. – Rob

+0

@ J-Rock I ostatnia obserwacja, o której wspominałem wcześniej. Jeśli chcesz ciągłego gestu, który rozpoczyna się bardzo szybko po dotknięciu ekranu i trwa w trakcie poruszania się, możesz użyć 'UIPanGestureRecognizer'. Jeśli to działa dla ciebie, ma to więcej sensu. Większość programistów byłaby wprowadzana w błąd przez użycie długiego aparatu rozpoznawania gestów, który pozwala na ruch o wartości 600 punktów. Jeśli musisz użyć długiego naciśnięcia z jakiegoś powodu (np. Ważne jest, aby na początku było to oczekiwanie 0,1), użyj go, w przeciwnym razie rozważ "UIPanGestureRecognizer". – Rob

Powiązane problemy