2009-03-10 10 views
23

Ich habe mehrere UIButton s, die ich verwende, um die aktuelle Aktion beim Tippen im Hauptbereich einzustellen. Ich möchte dem Benutzer auch erlauben, von der Schaltfläche direkt in den Hauptbereich zu ziehen und die gleiche Aktion auszuführen; Im Wesentlichen sollten die touchesBegan und touchesMoved beim Berühren der UIB-Tasten an die Hauptansicht übergeben werden, aber auch die Taste drücken.Gibt es eine Möglichkeit, Berührungen durch das iPhone zu übertragen?

Gerade jetzt, ich habe die Touch-up in der Änderung der Steuerung. Der Zieh-Exit ruft den Bereich zum Aufbessern von Innen auf, um das Steuerelement festzulegen, und ruft dann den Abschnitt "Berührungen begonnen" auf, um den Vorgang zum Berühren des Hauptbereichs zu starten.

Allerdings werden an dieser Stelle die touchesMoved und touchesEnded offensichtlich nicht aufgerufen, da die Berührungen von der UIButton stammen.

Gibt es eine Möglichkeit, die Berührungen zu ignorieren, sodass sie an den Hauptbereich übergeben werden, aber auch, dass ich das Steuerelement zuerst einstellen kann?

Antwort

24

In der Dokumentation sucht Responder Objects and the Responder Chain

können Sie „teilen“ berührt zwischen Objekten durch die Nachbesserungs der Antwortkette weitergeleitet werden. Ihr UIButton hat einen Responder/Controller, der die UITouch-Ereignisse empfängt. Ich schätze, sobald er seine Interpretation der Nachricht, die er zurückgibt, ausgeführt hat - die Berührung wurde behandelt und entsorgt.

von Apple so etwas wie dies deutet darauf hin, (basierend auf der Art der Berührung natürlich):

[self.nextResponder touchesBegan:touches withEvent:event];

Anstatt des Berührungsereignisses Entsorgung es weitergegeben wird.

Sub eingestuft UIButton:

MyButton.h

#import <Foundation/Foundation.h> 

@interface MyButton : UIButton { 

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

@end 

MyButton.m

#import "MyButton.h" 

@implementation MyButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    printf("MyButton touch Began\n"); 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Also würde ich in diesem Fall UIButton ableiten müssen, um die Berührungen zu übergeben, nehme ich an? –

+0

Subclassing sollte nicht notwendig sein, Sie müssen die Kette ein wenig erkunden. Die Ansicht oder das Steuerelement, das Ihre Schaltfläche enthält, ist der nächste Responder in der Kette. – Paxic

+1

Ich fürchte, ich sehe nicht, wie man Nachrichten von der UIButton abfängt und an die UIView weitergibt, ohne die UIButton zu untergliedern, um die Nachricht tatsächlich zu erhalten. –

35

Ich weiß, diese Frage ist zwei Jahre alt (und bereits beantwortet), aber trotzdem ...

Wenn ich das selbst ausprobierte, wurden die Berührungen weitergeleitet, aber die Tasten verhielten sich nicht mehr wie Knöpfe. Ich habe auch die Berührungen zu "super" weitergegeben und nun ist alles in Ordnung.

Also, für Anfänger, die auf diese stolpern könnte, ist es das, was der Code sollte wie folgt aussehen:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 
+0

Fantastisch! Ich hatte genau das gleiche Problem und das hat es gelöst! Upvote gegeben! – EmphaticArmPump

+2

Würde diese Methode in der Unterklasse von UIButton sein? –

+1

Ja, es würde in einer Unterklasse von UIButton verwendet werden. – daveMac

17

Keine Notwendigkeit, Unterklasse entweder! Kleben Sie dies einfach an die Spitze Ihrer Implementierung:

+0

Funktioniert wie ein Charme :-) Vielen Dank! –

+3

Übrigens kann es immer noch notwendig sein, Unterklassen zu bilden. Was ist zum Beispiel, wenn Sie Tasten, die in der gleichen Ansicht berührt werden müssen, mit Schaltflächen mischen müssen, die Sie aus irgendeinem Grund nicht haben möchten? Als ich das zum ersten Mal ausprobierte, habe ich eine Kategorie in UIButton erstellt, aber aus dem oben genannten Grund war es sicherer, eine Unterklasse zu verwenden, damit ich genau weiß, wann ich einen Knopf verwende, der die Berührungen weiterleitet. – daveMac

+1

Auch sollten Sie das gleiche mit 'touchesCancelled' tun. –

Verwandte Themen