2009-08-02 7 views
1

Ich habe ein statisches Kartenbild mit einer Reihe von Kreisen und Quadraten darauf, die Städte darstellen. Ich habe das Bild in eine Bildansicht geladen, die unter einer Bildlaufleiste untergeordnet ist, sodass ich Benutzerberührungen erfassen und über die Karte zoomen/blättern kann. Meine Herausforderung besteht darin, dass ich ein Label aufklappen möchte, wenn ein Nutzer einen dieser Kreise/Quadrate für eine Stadt berührt, um ihm mitzuteilen, um welche Stadt es sich handelt, und möglicherweise eine Detailansicht für die Stadt zu laden. Ich dachte, ich könnte alle relativen CGPoints für die Städte basierend auf der imageView Karte in ein Wörterbuch laden, so dass ich sie während eines "touchBegan" -Ereignisses referenzieren kann, aber ich komme schnell über meinen Kopf hinweg und gehe möglicherweise darüber Falsche Weg.iPhone erkennt Berührungen auf einem Kartenbild

Bis jetzt funktioniert alles und ich kann die CGPoint X- und Y-Koordinaten von Berührungen erfassen. Das größte Problem, das ich habe, ist das Bestimmen der Nähe der Benutzerberührungen zu einem diskreten Punkt, den ich in dem Wörterbuch haben kann. Mit anderen Worten, wenn das Wörterbuch "Boston = NSPoint: {235, 118}" hat; Wie kann ich feststellen, wenn ein Benutzer in der Nähe dieses Punktes ist, ohne dass er die Berührung wiederholt, bis es genau ist? Gibt es eine einfache Möglichkeit festzustellen, ob eine Berührung eines Benutzers mit einem bereits vorhandenen Punkt "nahe" ist? Gehe ich das richtig?

Alle Ratschläge oder Ohrfeigen im Hinterkopf sind willkommen.

Dank, Mike

Antwort

0

Sie könnten UIButtons verwenden, um die Städte darzustellen. Dann erhalten Sie die Standard-Touch, Highlight, usw., Verhaltensweisen mit weniger Aufwand. Wenn Sie die Schaltflächen als Unteransichten auf Ihrer Karte hinzufügen, sollten sie skalieren und mit der Karte scrollen.

+0

Ich dachte darüber nach, aber mit 50+ Stadtpunkten wäre es verrückt, so viele Objekte zu deklarieren/verwalten. Danke für die Antwort - Mike. –

+0

Auch wenn es verrückt erscheinen mag, könnten Sie einfach durch Ihr Wörterbuch iterieren, den Punkt der Stadt herausziehen, eine neue Schaltfläche mit 15 x 15 Pixel erstellen und dann das Zentrum mit dem Punkt der Stadt festlegen. Die andere Sache, die Sie tun müssen, ist die Verbindung zu einer Methode (addTarget: action: forControlEvent :) und stellen Sie sicher, dass Sie eine Möglichkeit haben zu erkennen, welcher Button welcher Stadt entspricht. Eine Möglichkeit besteht darin, die Tag-Eigenschaft der Schaltfläche als Index der Stadt in einem Array festzulegen. –

+0

Danke Dave, das ist im Grunde, was ich getan habe. Ich iteriere durch ein Wörterbuch von Punkten, die eine zusammengesetzte if-Anweisung vergleichen (+/- 10), und wenn ich einen Punkt innerhalb der Toleranz finde, ziehe ich den Namen der Stadt aus dem Wörterbuch und erzeuge/zeige eine Ansicht mit dem Städtenamen und an ein paar Tasten für Benutzeraktionen. - Nochmals vielen Dank, Mike –

0

können Sie entweder ein R-Tree, oder Sie können die Nähe der Note zu jedem sichtbaren Punkt in der aktuellen Ansicht berechnen. Um die Nähe zu berechnen, würden Sie normalerweise den Satz des Pythagoras verwenden, aber in diesem Fall können Sie die Quadratwurzel überspringen, weil Sie nur die relativen Größen vergleichen. Sie können auch eine Entfernung angeben, wenn Sie sagen, 50 Pixel im Quadrat zu 2500. So würden Sie das Ergebnis in ein Objekt mit Abstand und Referenzpunkt und legen Sie die Objekte in ein NSMutableArray, nicht die Ergebnisse unter Ihrem Cutoff, und hinzufügen Wählen Sie das Mindestergebnis.

Wenn Sie also einen Punkt berührt pT haben, dann für jeden Punkt pN, dann würden Sie berechnen:

d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance 

Der Punkt pN mit dem minimalen d ist der Punkt, der am nächsten zu pT war. Und wie ich schon sagte, wenn Sie nur Berührungen innerhalb von 10 Pixeln zählen möchten, können Sie das testen d <= 10*10;

Die Testmethode für Berührungen innerhalb einer Fläche von 20x20 Quadrat funktioniert auch, außer wenn zwei Punkte innerhalb von 20 Pixel voneinander sind, dann müssen Sie wissen, welcher Punkt am nächsten ist.

+1

Danke für den Rat, aber ich kann kaum Pythagoräer buchstabieren, geschweige denn, es zu verstehen. Du bist offensichtlich einer der schlauen Kids und ich war einer der Dummies, die Mathe ausgelassen haben. Nachdem ich mit meinen Hunden einen Spaziergang gemacht hatte, um meinen Kopf frei zu bekommen, dachte ich über eine Lösung nach, um die Berührungskoordinaten x und y mit einem Verzeichnis gespeicherter x- und y-Koordinaten der Stadt zu vergleichen. if ((touchPoint.y> = (mapPoint.y -10) && touchPoint.y <= (mapPoint.y +10)) \t \t \t && (touchPoint.x> = (mapPoint.x -10) && touchPoint.x <= (mapPoint.x +10))) { // etwas tun } Danke, dass Sie sich die Zeit nehmen zu antworten - Mike. –

0

Wenn ich es richtig verstanden habe, möchten Sie wissen, ob der Punkt, an dem der Benutzer getappt hat, "nah" genug zu einem Punkt ist, der als Stadt markiert ist.

Sie müssten schließen schließen, d. H. Einen Schwellenwert festlegen, nach dem der Tap weiter ist, vor dem der Tap näher ist.

Sobald Sie dies tun, berechnen Sie die kartesischen Koordinatenabstand sqrt ((x1-x2)^2 + (y1-y2)^2) für jedes Element (Lesewörterverzeichnis mit x, y-Werten für Städte) im Array und speichern Sie die Ergebnisse in einem anderen Array. dann nimm das Minimum des Ergebnisses. Der Index dieses Ergebnisses ist die Stadt, die dem Abgriff am nächsten ist, wenn sie kleiner als der genannte Schwellenwert ist.