2010-12-16 5 views

Antwort

16

Ja, es ist ziemlich einfach, dies mit einem UILongPressGestureRecognizer (auf iPhone OS 3.2+) zu implementieren. Ein langer Druck wird durch den Gestenerkenner ausgeführt, und ein kurzes Antippen führt zur normalen Aktion des Knopfes.

Zum Beispiel subclassed ich UIButton und addierte die folgenden Verfahren für eine lange Berührungsaktion Angabe mit einem Hahn gehen zusammen (longPressGestureRecognizer ist eine Instanzvariable):

- (void)setLongTouchAction:(SEL)newValue 
{ 
    if (newValue == NULL) 
    { 
     [self removeGestureRecognizer:longPressGestureRecognizer]; 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 
    } 
    else 
    { 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 

     longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue]; 
     [self addGestureRecognizer:longPressGestureRecognizer]; 
    } 
} 

Ich könnte dann folgendermaßen einstellen beiden kurzes Antippen und lange drücken Aktionen, die mit dem gleichen Ziel behandelt werden:

[undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside]; 
[undoButton setLongTouchAction:@selector(showUndoOptions:)]; 

Wie Sie sehen können, ist dies nützlich für die Rückgängig-Tasten, die Sie in Titelleisten von vielen iPad-Anwendungen zu sehen.

+0

Kann ich longPressGestureRecognizer in Cocos2D oder Box2D Spiel verwenden. In meinem Spiel muss ich den Spielersprung abhängig von der Dauer der Berührung auf dem Bildschirm variieren? Oder was kann meine Lösung noch sein? – Nitish

4

Die beste Lösung, die ich mir vorstellen kann, ist, eine andere Klasse und Unterklasse UIButton zu erstellen. Dann können Sie im Interface Builder (wenn Sie das verwenden) die Klasse der Schaltfläche auf die benutzerdefinierte Klasse setzen, die Sie gerade erstellt haben.

So in dieser neuen Klasse, müssen Sie eine Methode

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

Diese im Grunde genannt außer Kraft gesetzt wird, die besagt, dass jemand auf Ihrer Taste gedrückt wird. Die Berührungen sind ein NSSet und es enthält alle Informationen für alle Finger, die auf den Bildschirm drücken. Wenn Sie nur in der einen interessiert sind, die sich auf die Schaltfläche drücken, werden Sie wahrscheinlich so etwas wie haben:

NSSet *myTouches = [event touchesForView:self.view]; 

So, jetzt, dass Sie die berührt haben, die Ihre Taste entsprechen, müssen Sie herausfinden, wie viele Mal, dass der Benutzer auf diese Schaltfläche geklickt hat. Sie tun das mit etwas wie:

NSUInteger numTaps = [[myTouches anyObject] tapCount]; 

Wenn diese Zahl 2 ist, bedeutet das, dass der Benutzer nur zweimal auf Ihre Schaltfläche geklickt hat. Jetzt kommt der nächste Teil. Woher weißt du, ob der Benutzer diesen Knopf hält? Gut, wenn der Benutzer den Bildschirm loslässt, wird eine andere Methode aufgerufen. Sie werden auch, dass man außer Kraft setzen müssen:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

Dies ist, wo Sie wissen, ob die Person den Bildschirm zu berühren oder wenn mit dem Finger auf sie ist immer noch zum Stillstand gekommen ist. Wenn sich sein Finger noch darauf befindet, wurde dieses Ereignis noch nicht aufgerufen.

Jetzt genug mit dem Hintergrund

Hier ist mein Vorschlag an Sie. Ich schlage vor, Sie überschreiben die touchesBegan: -Methode und überprüfen Sie, ob die Anzahl der Taps in der Taste 2 ist. Wenn ja, dann starten Sie einen Timer, der tut, was Sie tun müssen, so lange Sie es tun müssen, und dann Mit der Methode touchesEnded: werden Sie den Timer stoppen und auf diese Weise haben Sie alles getan, was Sie tun müssen, solange Sie es tun müssen, ODER solange der Benutzer es durchgehalten hat zum Knopf.

Ich hoffe, das hilft, offensichtlich habe ich nicht den ganzen Code für Sie geschrieben, Sie müssen experimentieren und recherchieren, aber wenn Sie irgendwelche Fragen haben, werde ich gerne helfen:)

8

Brad Larson's Antwort sieht ziemlich gut aus, aber hier ist eine weitere, die Ihnen ein bisschen mehr Flexibilität/Kontrolle geben könnte, was Sie wollen oder wollen.

Sie UIButton Unterklasse überschreiben Sie die touchesBegan und touchesEnded Methoden, so dass, wenn der Benutzer eine Note beginnt Sie

[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0]; 

nennen und in der touchesEnded rufen Sie:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil]; 

die Veranstaltung abzusagen wenn der Finger zu früh angehoben wurde.

Sie können vollständigen Code für diesen in dieser Blog-Post bekommen:

http://www.isignmeout.com/adding-long-tap-functionality-uibutton/

+0

Dies ist auch die einzige Möglichkeit, die für Nutzer von iPhone OS Versionen vor 3.2 funktioniert. Gesture Recognizer, wie ich sie benutzt habe, existierten vorher nicht im OS. –

Verwandte Themen