2012-11-06 8 views
5

Często potrzebuję wystrzelić sekwencję zdarzeń w wyniku przytrzymania przycisku. Pomyśl o przycisku +, który zwiększa pole: stuknięcie go powinno zwiększyć go o 1, ale dotknij & przytrzymaj, powiedz: zwiększaj to o 1 co sekundę, aż przycisk zostanie zwolniony. Innym przykładem jest funkcja szorowania podczas przytrzymywania przycisku wstecz lub do przodu w aplikacji typu odtwarzacz audio.Elegancki sposób realizacji naciśnij i przytrzymaj ciągłe wydarzenie zdarzenia?

zwykle uciekają się do następującej strategii:

  1. Na touchDownInside skonfigurować powtarzający czasomierz z moim pożądanym przedziale.
  2. Na touchUpInside Podważam i zwalniam licznik czasu.

Jednak dla każdego takiego przycisku potrzebuję osobnej zmiennej instancji licznika czasu, 2 akcji docelowych i 2 implementacji metod. (Zakładam, że piszę klasę ogólną i nie chcę nakładać ograniczeń na maksymalną liczbę jednoczesnych dotknięć).

Czy istnieje bardziej elegancki sposób rozwiązania tego, czego mi brakuje?

+2

'UILongPressGestureRecognizer' z zależnym' UITapGestureRecognizer'. To wszystko. –

+0

duplikat: http://stackoverflow.com/questions/9971241/ios-press-and-hold-gesture-tap –

Odpowiedz

1

Rejestracja zdarzeń dla każdego przycisku przez:

[button addTarget:self action:@selector(touchDown:withEvent:) forControlEvents:UIControlEventTouchDown]; 
[button addTarget:self action:@selector(touchUpInside:withEvent:) forControlEvents:UIControlEventTouchUpInside]; 

Dla każdego przycisku, ustawić atrybut tag:

button.tag = 1; // 2, 3, 4 ... etc 

w uchwycie, co trzeba zrobić. Wskaż przycisk pod tagiem:

- (IBAction) touchDown:(Button *)button withEvent:(UIEvent *) event 
{ 
    NSLog("%d", button.tag); 
} 
2

Proponuję UILongPressGestureRecognizer.

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(addOpenInService:)]; 
    longPress.delegate  = self; 
    longPress.minimumPressDuration = 0.7; 
    [aView addGestureRecognizer:longPress]; 
    [longPress release]; 
    longPress = nil; 

Na wypalania zdarzenie, można uzyskać połączenia w

- (void) addOpenInService: (UILongPressGestureRecognizer *) objRecognizer 
{ 
    // Do Something 
} 

Podobnie można użyć UITapGestureRecognizer uznawania krany użytkowników.

Mam nadzieję, że to pomoże. :)

Powiązane problemy