2012-08-07 9 views
9

Ich verwende XCode 4.4 für iOS 5 auf einem iPad und verwende das Storyboard-Layout beim Erstellen meiner benutzerdefinierten Schaltfläche.Wie erhalte ich die Tap-Koordinaten auf einer benutzerdefinierten UIButton?

Ich habe das Touch-Ereignis korrekt arbeiten und protokollieren, aber jetzt möchte ich die X/Y-Koordinaten des Wasserhahns auf meine benutzerdefinierte Schaltfläche erhalten.

Wenn möglich, möchte ich, dass die Koordinaten relativ zur benutzerdefinierten Schaltfläche und nicht relativ zum gesamten iPad-Bildschirm sind.

Hier ist mein Code in der H-Datei:

- (IBAction)getButtonClick:(id)sender; 

und mein Code in der .m-Datei:

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

Wie ich schon sagte, dass korrekt protokolliert, wenn ich das Bild tippen.

Wie kann ich die Koordinaten des Wasserhahns bekommen?

Ich habe ein paar verschiedene Beispiele aus dem Internet ausprobiert, aber sie frieren immer ein, wenn sie eine Reihe von Zahlen (vielleicht die Koordinaten) in der Protokollbox anzeigen. Ich bin SEHR neu in iOS, also mach es so einfach wie möglich. Vielen Dank!

+1

Warum Sie Koordinaten müssen? –

+0

Artern stellt die richtige Frage. Müssen Sie wirklich die Koordinaten innerhalb einer Schaltfläche kennen oder möchten Sie einfach nur wissen, auf welche Schaltfläche geklickt wurde (in diesem Fall brauchen Sie Wladimirs exzellenten Vorschlag von "Absender und Ereignis" nicht), sondern Sie können einfach nur schauen am Absender, um festzustellen, auf welche Schaltfläche geklickt wurde. – Rob

+2

Ich brauche die Koordinaten, weil ich ein Bild als UIButton zeige und ich muss wissen, wo auf dem Bild der Benutzer angetippt hat. Ich weiß bereits, wie ich feststellen kann, auf welche Schaltfläche geklickt wurde. – twbbas

Antwort

28

Berührungsstelle bekommen Sie eine weitere Variante der Schaltfläche Aktion-Methode verwenden können: myAction:forEvent: (wenn Sie es von IB-Schnittstelle Hinweis „Absender und Ereignis“ Option in Argumente Feld zu erstellen: enter image description here) Sie

Dann in Ihrem Action-Handler Berührungsstelle von Ereignisparameter erhalten kann, zum Beispiel:

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event { 
    NSSet *touches = [event touchesForView:sender]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:sender]; 
    NSLog(@"%@", NSStringFromCGPoint(touchPoint)); 
} 
+1

Danke für Ihre ausführliche Antwort. Allerdings bekomme ich immer noch den gleichen Fehler, wenn ich anderen Code aus dem Internet ausprobiere. "unrecognized Selector an Instanz 0xde26e40 gesendet 2012-08-07 10: 29: 36.126 Unterschiede [41044: 707] *** Beenden von App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [DifferencesViewController getButtonClick:]: nicht erkannt Selektor gesendet 0xde26e40 '"Haben Sie irgendwelche Ideen? – twbbas

+1

@ user1262552, Sie haben immer noch getButtonClick: -Methode an Ihre Schaltfläche Aktion angehängt, überprüfen Sie Ihre Storyboard-Datei oder Code, um sicherzustellen, Button-Aktion ist mit bestehenden Methode Ihres View-Controller – Vladimir

+0

verbunden und die App scheint einzufrieren, wenn ich auf das Bild tippen. – twbbas

0

für Ihre Gesamt Koordinaten (mit Bezug auf den Bildschirm), benötigen Sie einen CGPoint erstellen, die die Koordinaten Ihres Touch enthält. Aber um das zu tun, müssen Sie zuerst diese Berührung bekommen. Beginnen Sie also mit dem Touch-Ereignis und machen Sie diesen Punkt mit der Methode locationInView. Je nachdem, wann Sie die Berührung protokollieren möchten - wenn der Benutzer auflegt oder den Finger hebt - müssen Sie diesen Code in die Methode touchesBegan oder touchesEnded implementieren. Nehmen wir an, Sie tun touchesEnded, die ein NSSet cales "berührt", die alle Berührungsereignisse enthält.

UITouch *tap = [touches anyObject]; 
CGPoint touchPoint = [tap locationInView:self.view]; 

"touchPoint" enthält jetzt den Punkt, an dem der Benutzer den Finger hebt. Um die Koordinaten auszudrucken, greifen Sie nur die x- und y-Eigenschaften dieses Punktes:

CGFloat pointX = touchPoint.x; 
CGFloat pointY = touchPoint.y; 
NSLog(@" Coordinates are: %f, %f ", pointX, pointY); 

Das sollte geben die Koordinaten der Berührung. Um nun darauf zu verweisen, welche Schaltfläche Sie verwenden, würde ich vorschlagen, dass Sie die Werte für die Koordinaten der Schaltfläche einfach manuell vom Punkt subtrahieren. Es scheint eine einfache Lösung zu sein, und ehrlich gesagt kenne ich keine Möglichkeit, Koordinaten mit Bezug auf ein anderes Objekt zu erhalten, es sei denn, Sie erstellen eine Ansicht basierend auf diesem Objekt und übergeben sie an locationInView anstelle von self.view.

Für weitere Informationen über Berührungen gibt es eine große Reihe von Tutorials here.

1

Incase of Swift 3.0 die akzeptierte Antwort funktioniert gleich, außer Syntax wird wie folgt geändert werden:

Swift 3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) { 
    let myButton = sender as! UIButton 
    let touches = event.touches(for: myButton) 
    let touch = touches?.first 
    let touchPoint = touch?.location(in: myButton) 
    print("touchPoint\(touchPoint)") 
    } 
Verwandte Themen