2013-07-12 14 views
10

Sono nuovo di IOS, quindi mi scuso in anticipo se mi manca qualcosa di ovvio.UIPanGestureRecognizer fa qualcosa immediatamente quando viene toccato

Sto creando un puzzle in cui vorrei che i singoli pezzi del puzzle aumentassero di dimensioni al tatto e diminuissero di lasciar andare.

Attualmente ho:

-(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{ 
    if(recognizer.state == UIGestureRecognizerStateBegan) 
    else if(recognizer.state == UIGestureRecognizerStateEnded) 
} 

il pezzo del puzzle aumenta la dimensione quando inizia la padella (che è anche quando lo statebegan) e diminuisce in termini di dimensioni, quando la padella estremità (come previsto). Vorrei che la dimensione aumentasse quando l'utente ha toccato il pezzo e prima che il pezzo del puzzle si muova. Ciò si vede in Words With Friends quando si seleziona una tessera.

ho cercato

-(IBAction)handleTap:(UITapGestureRecognizer *)recognizer{ 
    if(recognizer.state == UIGestureRecognizerStateBegan) 
    else if(recognizer.state == UIGestureRecognizerStateEnded) 
} 

Ciò consentirà di aumentare il pezzo del puzzle solo dopo che il dito si è alzato.

MIA DOMANDA:

C'è un modo per aumentare le dimensioni di un pezzo di puzzle, una volta il dito ha toccato il pezzo del puzzle e poi continuare con il gesto padella.

Grazie in anticipo.

+0

Sì, lo stato di "mezzo" è mancante. Devi rintracciarlo per vedere se hanno iniziato a spostarsi ('translationInView'). –

risposta

23

Avevo bisogno di fare anche questo, e il suggerimento di Jake ha funzionato perfettamente per me. In caso aiuta chi si imbatte in futuro, ecco la mia implementazione sottoclasse UIPanGestureRecognizer (l'intestazione rimane invariato):

#import "ImmediatePanGestureRecognizer.h" 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@implementation ImmediatePanGestureRecognizer 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    self.state = UIGestureRecognizerStateBegan; 
} 

@end 

Questo è tutto ciò che serve, questo scatterà non appena si mette il dito down the view, aggiorna non appena muovi il dito in un punto qualsiasi in qualsiasi direzione e fornisci le funzionalità di un normale UIPanGestureRecognizer (come translationInView e velocityInView) prima che uno normale si licenzi, tutto senza rompere alcuna funzionalità esistente.

+0

Sei un genio, non avrei mai pensato di farlo. Il riconoscitore di gesti chiamerà il suo selettore due volte con lo stesso valore di stato ... –

+0

Cosa succede se stiamo implementando un ImmediatePanGestureRecognizer su un UIview che a sua volta ha un metodo TouchsBegan? come possiamo dare la priorità a questo? –

1

Secondo the documentationUIPanGestureRecognizer entra solo UIGestureRecognizerStateBegan quando "il numero minimo di dita ammesso (minimumNumberOfTouches) si è mosso abbastanza per essere considerato una padella". Se vuoi che qualcosa accada non appena tocchi, puoi provare la sottoclasse di UIPanGestureRecognizer e oltrepassando lo touchesBegan:withEvent:.

0

Sto provando a fare una cosa simile, e la risoluzione su cui ho lavorato è usare i tocchi della vista. Began: withEvent: per eseguire le azioni che voglio accadere nel momento in cui l'utente tocca lo schermo. Quindi il gestore del gesto prende il sopravvento quando il tocco diventa un gesto.

6

Ho implementato la risposta di George WS. Con un po 'di test mi sono reso conto che gli eventi tattili aggiuntivi che si verificano dopo il tocco iniziale, ma prima che il tocco iniziale finisca, non vengono gestiti correttamente. Ecco la mia implementazione aggiornata. È un po 'ingenuo, ma impedisce il comportamento bizzarro causato da UIGestureRecognizerStateBegan che si verifica più volte.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (self.state >= UIGestureRecognizerStateBegan) { 
     return; 
    } 

    [super touchesBegan:touches withEvent:event]; 
    self.state = UIGestureRecognizerStateBegan; 
} 
1

Grazie George WS & Derrick Hathaway

Swift 2.2

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) { 
    if (self.state == UIGestureRecognizerState.Began) { 
    return 
    } 
    super.touchesBegan(touches, withEvent: event) 
    self.state = UIGestureRecognizerState.Began; 
} 

E si deve aggiungere alla vostra Bridging-Header:

#import <UIKit/UIGestureRecognizerSubclass.h> 
1

Swift 3/4 Soluzione

import UIKit.UIGestureRecognizerSubclass 

class InstantPanGestureRecognizer: UIPanGestureRecognizer { 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
     if (self.state == UIGestureRecognizerState.began) { return } 
     super.touchesBegan(touches, with: event) 
     self.state = UIGestureRecognizerState.began 
    } 

} 
Problemi correlati