iPad-Programmierung

iPad-Programmierung

von: Daniel H. Steinberg, Eric T. Freeman

O'Reilly Verlag, 2012

ISBN: 9783897215795

Sprache: Deutsch

264 Seiten, Download: 6558 KB

 
Format:  EPUB, PDF, auch als Online-Lesen

geeignet für: geeignet für alle DRM-fähigen eReader geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Apple iPod touch, iPhone und Android Smartphones Online-Lesen PC, MAC, Laptop


 

eBook anfordern

Mehr zum Inhalt

iPad-Programmierung



3.6 Eigene Gesten erstellen


Apple bietet einige ausgezeichnete Gesten an, aber was ist, wenn diese Ihren Anforderungen nicht genügen? Dann können Sie natürlich eigene Gesten erstellen. Apple hat diesen Prozess geradlinig gestaltet, indem die Erweiterung der Basisklasse zur Gestenerkennung mit eigenen Klassen gestattet wird. Dennoch der Hinweis: Das Schreiben eigener Gesten erfordert, dass Sie etwas genauer wissen, wie Gesten funktionieren, und genau das werden wir uns in diesem Abschnitt ansehen. Dann werden wir dieses Wissen einsetzen, um eine eigene Geste für unsere Luftpolsterfolienanwendung zu schreiben.

Abbildung 3.4 Die Zustände eines diskreten Gesten-Recognizers

Wie Gesten-Recognizer tatsächlich funktionieren


Betrachten Sie Gesten-Recognizer als einfache Zustandsmaschinen, die von einem Zustand in den anderen übergehen, je nachdem, welche Touch-Events sie empfangen, während der Benutzer mit dem Bildschirm interagiert. Alle Recognizer beginnen im gleichen Zustand: dem UIGestureRecognizerStatePossible-Zustand, der anzeigt, dass der Recognizer Touch-Events untersucht, um Gesten aufzuspüren. Ist eine Geste erkannt, gehen diskrete Gesten in den UIGestureRecognizerStateRecognized-Zustand über. Findet der Recognizer hingegen keine Geste, wechselt er in den Zustand UIGestureRecognizerStateFailed.

Bei kontinuierlichen Gesten läuft das etwas anders. Wie diskrete Gesten beginnen auch sie mit dem Zustand UIGestureRecognizerStatePossible. Aber wenn der Anfang einer kontinuierlichen Geste erkannt wird, wechselt der Recognizer in den Zustand UIGestureRecognizerStateBegan. Während sich die Geste dann mit der Zeit ändert, wechselt der Recognizer in den Zustand UIGestureRecognizerStateChanged. Das heißt, solange sich die Geste weiterhin ändert, setzt der Recognizer seinen Zustand auf UIGestureRecognizerStateChanged. Aus diesem Zustand heraus kann der Recognizer zwei Wege einschlagen: Wenn der Anwender seine Finger hebt, wechselt der Zustand zu UIGestureRecognizerStateEnded; der Recognizer kann jedoch auch entscheiden, dass die Geste nicht länger erfüllt wird, und in den Zustand UIGestureRecognizerStateCancelled wechseln.

Abbildung 3.5 Die Zustände eines kontinuierlichen Gesten-Recognizers

Veranschaulichen wir uns die unterschiedlichen Arten von Recognizern an konkreteren Beispielen. Beginnen wir mit einem diskreten Recognizer wie dem Ein-Finger-Tap-Recognizer. Dieser Recognizer befindet sich zu Anfang im Zustand UIGestureRecognizerStatePossible und wechselt, sobald ein Touch-Event auftritt, das ein Tap ist, in den Zustand UIGestureRecognizerStateRecognized. Nehmen Sie nun dagegen den kontinuierlichen Recognizer für die Pinch-Geste. Hier wechselt der Recognizer in den UIGestureRecognizerStateBegan-Zustand, wenn zwei Finger auf der Oberfläche platziert werden, und setzt dann wiederholt den Zustand auf UIGestureRecognizerStateChanged, während die Finger die Pinch-Geste vollziehen. Entfernt der Benutzer seine Finger, setzt der Recognizer den Zustand UIGestureRecognizerStateEnded.

Eine Löschen-Geste erstellen


Nachdem wir uns das eingeprägt haben, können wir über die Geste nachdenken, die wir implementieren werden: Wenn Sie je einen Apple Newton in den Fingern hatten, werden Sie sich wahrscheinlich an eine Geste erinnern, bei der Sie eine Zickzacklinie über einem Objekt zeichnen mussten, die der Bewegung ähnelt, die man mit einem Radiergummi macht. Wurde diese Geste erkannt, löschte der Newton das darunterliegende Objekt.

Wir werden einen Recognizer implementieren, der eben diese Geste erkennt. Diesen werden wir dann nutzen, um die darunterliegende Luftblase zu löschen. Überlegen Sie einen Augenblick, wie Sie den Code schreiben würden, der diese Geste entdeckt. Obgleich es viele Möglichkeiten gibt, Multi-Touch-Events zu analysieren, um eine radiergummiartige Bewegung zu erkennen, werden wir einfach schauen, was wir mit einer einfachen Heuristik erreichen können.

So wird unsere Heuristik funktionieren: Beachten Sie, dass die Löschen-Geste eigentlich nur eine Hoch-runter-Bewegung ist, die wir nachverfolgen können, indem wir einfach die Bewegung entlang der y-Achse überwachen. Gibt es im y-Wert einen Wechsel von zunehmend zu abnehmend (oder umgekehrt), kennen wir die Richtung, in die sich der Verlauf der Bewegung geändert hat. Und wenn wir diese Wechsel zählen, können wir nach zwei oder drei Änderungen entscheiden, dass das eine Löschen-Geste ist. Natürlich ist dieses Verfahren nicht perfekt – deswegen bezeichnen wir es auch als heuristisch. Was schiefgehen könnte? Beispielsweise könnte ein Anwender eine lange Wischbewegung machen, die etwas zu sehr abschweift und das Wischen wie ein Löschen aussehen lässt. Oder je nach Wischalgorithmus (den wir nicht kennen) könnte ein zu ausgreifendes Löschen als Wischen interpretiert werden. Wie groß dieses Problem ist? Nicht sehr groß, wie Sie sehen werden, aber dann und wann könnte es auftreten, da die Gesten eine gewissen Ähnlichkeit haben. Aber das ist nicht schlimm, wir werden die Sache weiter unten in diesem Kapitel beheben.

UIGestureRecognizer erweitern


Es ist Zeit, dass wir damit beginnen, diesen Recognizer zu schreiben. Das tun wir, indem wir zunächst eine Unterklasse der Recognizer-Basisklasse erstellen. Schreiben wir zunächst eine Schnittstellendatei namens DeleteGestureRecognizer.h.

gestures/Bubbles5/Classes/DeleteGestureRecognizer.h #import <Foundation/Foundation.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface DeleteGestureRecognizer : UIGestureRecognizer { } @end

Hier importieren wir die Header-Datei UIGestureRecognizerSubclass.h, die die UIGestureRecognizer-Basisklasse definiert, und deklarieren eine neue Schnittstelle für DeleteGestureRecognizer, die UIGestureRecognizer erweitert.

Jetzt werden wir die Methoden ergänzen, die wir benötigen, um UIGestureRecognizer zu erweitern. Fügen Sie Ihrer Schnittstellendefinition die folgenden Methoden hinzu:

gestures/Bubbles5/Classes/DeleteGestureRecognizer.h -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; -(void)reset;

Auf diese Methoden werden wir später zurückkommen, um sie vollständig zu beschreiben und in der Implementierungsdatei zu implementieren. Aber bevor wir das tun, werden wir der Schnittstellendatei noch einige weitere Dinge hinzufügen:

gestures/Bubbles5/Classes/DeleteGestureRecognizer.h #import <Foundation/Foundation.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface DeleteGestureRecognizer : UIGestureRecognizer { ? bool strokeMovingUp; ? int touchChangedDirection; ? UIView *viewToDelete; } ? @property (nonatomic, retain) UIView *viewToDelete; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; - (void)reset; @end

Wir haben drei Dinge hinzugefügt: zunächst eine bool-Variable namens strokeMovingUp, die den Wert YES erhält, wenn sich die Geste in positive y-Richtung bewegt (andernfalls NO), dann einen int namens touchChangedDirection, der festhält, wie oft die Geste die Richtung geändert hat, und schließlich einen UIView namens viewToDelete, der eine Referenz auf den View aufnehmen wird, der gelöscht werden soll, wenn die Geste erkannt wird.

Den DeleteGestureRecognizer implementieren


Jetzt sollten wir uns an die Implementierung machen. Bauen wir zunächst das Gerüst der Datei DeleteGestureRecognizer auf:

gestures/Bubbles5/Classes/DeleteGestureRecognizer.m @implementation DeleteGestureRecognizer @synthesize viewToDelete; @end

Wir werden nun die Methoden aus der Klasse UIGestureRecognizer durchgehen, die wir...

Kategorien

Service

Info/Kontakt