2010-10-25 16 views
5

Sto lavorando su un'app per iPhone che richiede di controllare se il pulsante è stato premuto & tenuto premuto per 6 secondi & quindi attivare un'azione che sta riproducendo una sorta di suono.rilevando un tocco lungo su iPhone

Come devo rilevare questo rubinetto da 6 secondi?

D'altra parte l'utente può anche continuare a toccare il pulsante per 6 secondi & quindi la stessa azione dovrebbe sparare.

Cosa devo fare con più tocchi, come faccio a sapere che tutti i rubinetti rientrano nella fascia da 6 secondi?

risposta

17

Per una seconda pressione prolungata di sei, utilizzare un UILongPressGestureRecognizer con la proprietà minimumPressDuration impostata su 6.

Scrivi la tua gesture recognizer (diciamo, LongTappingGestureRecognizer) per la maschiatura continua per un determinato periodo; non dovrebbe essere troppo difficile. Assegnare una proprietà come (ad esempio, minimumTappingDuration) e una proprietà (ad esempio, maximumLiftTime) che determina per quanto tempo un dito può essere rimosso prima che non venga considerato un lungo gesto di tocco.

  • Quando riceve per la prima volta touchesBegan:withEvent:, registra l'ora.
  • Quando riceve touchesEnded:withEvent:, avviare un NSTimer (il timer di sollevamento) che invia al rilevatore di gesti un messaggio di annullamento (ad esempio cancelRecognition) dopo maximumLiftTime.
  • Quando riceve touchesBegan:withEvent: quando c'è un'ora di inizio, annullare il timer di sollevamento (se presente).
  • Il cancelRecognition passerà allo failed state.

Esistono varie strategie per la gestione del riconoscimento al raggiungimento della fine del gesto, dopo minimumTappingDuration. Uno è di controllare sia i gestori touchesBegan:withEvent: e touchesEnded:withEvent: se la differenza tra l'ora corrente e l'ora di inizio è> = minimumTappingDuration. Il problema è che ci vorrà più tempo di minimumTappingDuration per riconoscere il gesto se l'utente sta toccando lentamente e il dito è abbassato quando viene raggiunto lo minimumTappingDuration. Un altro approccio consiste nell'avviare un altro NSTimer (il timer di riconoscimento) quando viene ricevuto il primo touchesBegan:withEvent:, uno che causerà la transizione allo recognized state e che viene annullato in cancelRecognition. La cosa complicata qui è cosa fare se il dito viene sollevato quando il timer scatta. L'approccio migliore potrebbe essere una combinazione dei due, ignorando il timer di riconoscimento se il dito viene sollevato.

C'è di più nei dettagli, ma questo è il succo. Fondamentalmente, è un sistema di riconoscimento a lunga pressione che consente all'utente di sollevare il dito dallo schermo per brevi periodi. Potresti potenzialmente utilizzare solo il riconoscimento toccando e saltare il riconoscimento a lungo.

0

Ecco la mia soluzione.

- (IBAction) micButtonTouchedDownAction { 
    self.micButtonTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(micButtonAction:) userInfo:nil repeats:YES]; 
    self.micButtonReleased = FALSE; 
} 

- (IBAction) micButtonTouchedUpInsideAction { 
    self.micButtonReleased = TRUE; 
} 

- (IBAction) micButtonTouchedUpOutsideAction { 
    self.micButtonReleased = TRUE; 
} 

- (void) micButtonAction:(NSTimer *)timer { 
    [self.micButtonTimer invalidate]; 
    self.micButtonTimer = nil; 

    if(self.micButtonReleased) { 
     NSLog(@"Tapped"); 
    } 
    else { 
     NSLog(@"Touched"); 
    } 
} 
9

Mi rendo conto che questa è una domanda piuttosto datata, tuttavia la risposta dovrebbe essere piuttosto semplice.

Nella tua View Controller viewDidLoad:

//create long press gesture recognizer(gestureHandler will be triggered after gesture is detected) 
UILongPressGestureRecognizer* longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)]; 
//adjust time interval(floating value CFTimeInterval in seconds) 
[longPressGesture setMinimumPressDuration:6.0]; 
//add gesture to view you want to listen for it(note that if you want whole view to "listen" for gestures you should add gesture to self.view instead) 
[self.m_pTable addGestureRecognizer:longPressGesture]; 
[longPressGesture release]; 

Poi, nel tuo gestureHandler:

-(void)gestureHandler:(UISwipeGestureRecognizer *)gesture 
{ 
    if(UIGestureRecognizerStateBegan == gesture.state) 
    {//your code here 

    /*uncomment this to get which exact row was long pressed 
    CGPoint location = [gesture locationInView:self.m_pTable]; 
    NSIndexPath *swipedIndexPath = [self.m_pTable indexPathForRowAtPoint:location];*/ 
    } 
} 
+0

FWIW, OP descrive due situazioni che dovrebbero essere riconosciuti. Uno è una singola pressione lunga (che questo codice rileva). L'altro è una ripetuta intercettazione su un periodo di sei secondi (che questo codice non rileva, credo?). Ad ogni modo, il codice sopra riportato sarà utile alla maggior parte delle persone, che vogliono solo sapere come impostare un requisito di lunghezza minima per la stampa lunga. – ToolmakerSteve

Problemi correlati