2012-09-05 6 views
8

Angenommen, ich verfolge gerade eine Ziehgeste. In meinem Event-Handler verwende ich einen Schwellenwert, um zu bestimmen, wann der Ziehvorgang zu einer Aktion führt. Wenn der Schwellenwert überschritten wird, möchte ich angeben, dass die Ziehgeste beendet wurde.Wie kann ich einen UIGestureRecognizer programmatisch beenden/zurücksetzen?

Das einzige, was ich in der Dokumentation finden kann, ist diese Linie here:

Wenn Sie diese Eigenschaft ändern, um NO während ein Gestenerkenner ist derzeit eine Geste zu erkennen, einen abgebrochenen die Gestenerkenner Übergänge zu Zustand. So

:

if (translation.y > 100) { 
    // do action 
    [self doAction]; 

    //end recognizer 
    sender.enabled = NO; 
    sender.enabled = YES; 
} 

Dies funktioniert, aber es sieht aus wie könnte es eine sauberere Weg.

Kennt jemand eine andere Möglichkeit anzugeben, dass eine Geste programmgesteuert beendet wurde? Ich würde etwas wie eine Methode -end: erwarten, die ein abschließendes Ereignis mit Zustand UIGestureRecognizerStateEnded erzeugt.

+0

Können Sie beschreiben, was Sie mit der Ziehgeste tun? Ziehen Sie tatsächlich etwas? –

+0

Hi Fábio, ja, ich ziehe horizontal eine Seite eines virtuellen Buches, wenn der Schwellenwert überschritten wird, beginne ich die Animation um eine Seite umzudrehen und möchte dann die Ziehbewegung vorzeitig beenden, so dass ein Ereignis mit Status UIGestureRecognizerStateEnded ist generiert, die alle Aktionen behandelt, die mit dem regulären Ende dieser Geste verbunden sind. – Mattijs

Antwort

7

Haben Sie einen benutzerdefinierten UIGestureRecognizer definiert? Wenn sich die von Ihnen erkannte Geste von den von Apple definierten unterscheidet, weil sie eine andere Schwelle hat oder anders als ein normaler UIPanGestureRecognizer ist, dann kann es sinnvoll sein, Ihren eigenen UIGestureRecognizer zu erstellen. (see subclassing notes)

Wenn Sie UIGestureRecognizer subclassed haben, können Sie einfach den Zustand wie folgt festgelegt:

self.state = UIGestureRecognizerStateEnded; 

Sie wahrscheinlich dies tun wollen im touchesMoved: withevent: Methode. Beachten Sie auch:

"Unterklassen von UIGestureRecognizer müssen UIGestureRecognizerSubclass.h importieren. Diese Header-Datei enthält eine Deklaration des Status, die es Lese-Schreib-macht."

Auf der anderen Seite, wenn Sie nur ein UIGestureRecognizerDelegate implementieren, ist der Status schreibgeschützt, und es gibt keine Möglichkeit, es direkt festzulegen. In diesem Fall ist die Deaktivierungs-/Aktivierungsmethode möglicherweise das Beste, was Sie tun können.

+0

Subclassing ist die Antwort hier, um eine saubere Implementierung zu tun. So habe ich es nicht gedacht. Vielen Dank! – Mattijs

3

Mit dem Code, den Sie zeigten, müssen Sie die Logik zum Starten der Animation haben, wenn die Gestenerkennung abgebrochen wird, und ich würde sagen, das ist nicht gut, da es andere Möglichkeiten gibt, wie diese Gestenerkennung abgebrochen werden kann Habe die Animation gemacht.

Wenn Sie eine Methode zum Starten der Animation haben, müssen Sie diese Methode nur aufrufen, wenn der Schwellenwert überschritten und die Geste normal beendet wird. Zwei verschiedene Gelegenheiten dann. Der Code Sie präsentiert würde wie folgt aussehen:

if (translation.y > 100) { 
    // do action 
    [self finishFlip]; 
    sender.enabled = NO; 
    sender.enabled = YES; 
} 

annulliert die Geste auch nützlich sein, hier kann, wenn das alle folgenden Aktionen verhindert, wenn der Benutzer seine Finger hält ziehen.

Wenn Sie ein Team haben, das sich darüber entwickelt, und Sie ein bestimmtes Ereignis benötigen, sollten Sie den Gestenerkenner als nicht vorgeschlagen abstufen.