Modo per far sparare continuamente un UIButton durante una situazione di attesa e risposta?

Sai come Mario continua a correre a destra quando premi e tieni premuto il tasto destro sul D-Pad? Allo stesso modo, voglio che il mio UIButton attivi continuamente la sua azione per tutta la durata in cui viene tenuto premuto. È ansible per un UIButton? In caso contrario, è ansible farlo con UIImageView sovrascrivendo un metodo di gestione del touch in un determinato modo? In realtà, prima di provare a fare questo con UIButton, avevo alcune UIImageViews (disposte per funzionare come un D-Pad) che venivano controllate dai metodi di gestione touch ma le cose cominciavano a diventare disordinate quindi pensavo che questo potesse essere fatto più facilmente con UIButton e quindi cambiato. Chiunque sappia come ottenere il riconoscimento di un down-touch continuo, fermo (non commosso), si prega di condividere.

Non utilizzare un pulsante, utilizzare multi-touch e NSTimer:

Crea un object NSTimer view-local nell’interfaccia, quindi usalo per avviare / annullare il timer

-(void)movePlayer:(id)sender {  } -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { timer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(movePlayer:) userInfo:nil repeats:YES]; } -(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { if (timer != nil) [timer invalidate]; timer = nil; } -(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { if (timer != nil) { [timer invalidate]; timer = nil; } } 

In questo modo, puoi ripetere l’evento a intervalli predefiniti, senza dover contare su un pulsante e ottenere il comportamento di ripetizione che stai cercando. Nota il grilletto triggersto – se muove il dito, questo annulla il timer e il giocatore smette di muoversi.

Puoi anche fare qualcosa di simile a quanto mostrato nella risposta precedente e utilizzare ancora un UIButton.

Basta avviare il timer sul “Touch Down” e fermare il timer su “Touch Up Inside” o “Touch Up Outside”.

Personalmente, mi piace usare gli UIButtons perché offrono alcuni miglioramenti visivi integrati che non devi codificare da soli.

Per me i seguenti lavori:

  1. Crea un pulsante.
  2. Crea 2 metodi (smetti di toccare e inizia a toccare) nel controller di visualizzazione o in una sottoclass.
  3. Aggiungi 3 eventi di controllo. Ritocca all’interno e tocca Trascina Esci che entrambi si fermano toccando il metodo e Touch Down con il metodo di touch iniziale.
  4. Quando iniziamo a toccare il metodo invocato dovremmo avviare un NSTimer con intervallo di circa 0,2 (dipende da te quanto velocemente ti piacerebbe essere invocato), ripetere true e come selettore un metodo che vuoi venga invocato (con le cose reali che vuoi da eseguire quando l’utente preme il pulsante).
  5. Quando smettiamo di toccare il metodo invocato, dovremmo invalidare il timer ( .invalidate() ) e assegnare il timer come nullo.

È tutto!

E ora qualcosa di completamente diverso:
ReactiveCocoa 6 .

 self.button.reactive .controlEvents([.touchDown]) .observeValues { button in SignalProducer.timer(interval: .milliseconds(500), on: QueueScheduler.main) .take(until: button.reactive.controlEvents([.touchDragOutside, .touchDragExit, .touchUpInside, .touchUpOutside, .touchCancel]).map { _ in return }) .prefix(value: Date()) .startWithValues { date in NSLog("\(date)") } }