Modo per far sì che un UIButton si attivi continuamente durante una situazione di pressione prolungata?
-
05-09-2019 - |
Domanda
Sai come Mario continua a correre verso destra quando tieni premuto il pulsante 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.È possibile per un UIButton?In caso contrario, è possibile farlo con UIImageView sovrascrivendo un metodo di gestione del tocco in un certo modo?In realtà, prima di provare a farlo con UIButton avevo alcune UIImageViews (organizzate per funzionare come un D-Pad) che venivano controllate dai metodi di gestione del tocco, ma le cose hanno iniziato a diventare confuse, quindi ho pensato che potesse essere fatto più facilmente con UIButton e quindi commutato.Chiunque sappia come ottenere il riconoscimento di un down-touch continuo, stazionario (non mosso), lo condivida.
Soluzione
Non utilizzare un pulsante, utilizza multi-touch e NSTimer:
Crea un oggetto NSTimer locale per la visualizzazione all'interno della tua interfaccia, quindi utilizzalo per avviare/annullare il timer
-(void)movePlayer:(id)sender {
<Code to move player>
}
-(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 un intervallo predefinito, senza dover fare affidamento su un pulsante, e ottenere il comportamento di ripetizione che stai cercando.Nota il trigger touchMoved: se sposta il dito, il timer viene annullato e il giocatore smette di muoversi.
Altri suggerimenti
È anche possibile fare simile a ciò che viene mostrato nella risposta precedente ed ancora utilizzare un UIButton.
Basta avere il timer iniziato il "Touch Down" e hanno fermato il timer su entrambi i "Touch Up Inside" o "Touch Outside".
Personalmente, mi piace usare UIButtons perché offrono una certa costruito nel miglioramenti visivi non si dispone di codice da soli.
Per quanto mi riguarda le seguenti opere:
- Crea un pulsante.
- Crea 2 metodi (arresto toccante e iniziare a toccare) sia in controller di vista o di una sottoclasse.
- Aggiungi 3 Eventi di controllo. Touch Up All'interno e tocco drag Esci che entrambi vanno a fermarsi metodo toccante e Touch Down va con metodo start toccare.
- Quando si avvia il metodo toccando invoca dovremmo avviare un NSTimer con un intervallo di circa 0.2 (sta a voi quanto velocemente si desidera essere richiamato), ripetere vero e come selettore un metodo che si desidera essere richiamato (avendo l'attuale roba che si desidera eseguire quando l'utente preme il pulsante).
- Quando il metodo di arresto toccante invoca dovremmo invalidare timer
(
.invalidate()
) e assegnare il timer come nullo.
Questo è 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)")
}
}