Modo per far sì che un UIButton si attivi continuamente durante una situazione di pressione prolungata?

StackOverflow https://stackoverflow.com/questions/903114

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.

È stato utile?

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:

  1. Crea un pulsante.
  2. Crea 2 metodi (arresto toccante e iniziare a toccare) sia in controller di vista o di una sottoclasse.
  3. 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.
  4. 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).
  5. 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)")
            }
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top