Wie mache ich eine MKAnnotationView touch-sensitive?
Momentan habe ich einen Kartenausschnitt mit einigen Anmerkungen an Sie. Ich habe die Anmerkung mit eigene Bilder. Das problem versuche ich zu beheben, ist die Empfindlichkeit der Bilder. Wenn ich versuche zu ziehen, fühlt es sich wie ich haben, zu berühren, der genau in der Mitte für es zu sich auf. Gibt es eine Möglichkeit, um die touch-Grenzen größer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um dies zu tun, müssen Sie Unterklasse
MKAnnotationView
erstellen Sie Ihre eigenen benutzerdefiniertenMKAnnotationView
. In der Unterklasse überschreiben die folgenden Funktionen:Diese ermöglicht die interaktive Ansichten (wie Schaltflächen, etc.) gepresst werden. Die default-Implementierung in
MKAnnotationView
ist nicht streng aufpointInside
undhitTest
denn es ermöglicht die Maschinen, die sich tatsächlich in einer Anmerkung zu geschickt bekommen, um eine andere annotation. Es tut dies, indem Sie herausfinden, die am nächsten Beschriftungs-center, um die touch-Punkt und das senden der Ereignisse an, die annotation, das ist auch so, dass in der Nähe-zusammen (überlappend) Anmerkungen nicht gegenseitig blockieren ausgewählt werden. Aber in deinem Fall werden Sie wahrscheinlich wollen, zu blockieren, andere Anmerkungen, wenn der Benutzer auf die Auswahl und ziehen Sie den obersten annotation, also die oben genannte Methode ist wahrscheinlich das, was Sie wollen, oder aber es wird dich auf den richtigen Weg.EDIT:
Ich wurde gebeten, in den Kommentaren ein Beispiel für die Umsetzung von
hitTest:withEvent:
- Dies hängt davon ab, was genau du zu erreichen versuchst. Die ursprüngliche Frage vorgeschlagen, berühren und ziehen Sie Bilder in die Anmerkung in der Erwägung, dass in meinem Fall habe ich einige Knöpfe innerhalb der Anmerkung, ich soll interaktiv sein. Hier ist mein code:Wie Sie sehen können, es ist ganz einfach - Die
MKAnnotationView
Umsetzung (genannt alssuper
auf die erste Zeile meiner Umsetzung) gibt nur die erste (äußerste) der Ansicht, dass es nicht einen Drilldown durch die view-Hierarchie, um zu sehen, welche sub-view touch ist tatsächlich innen. In meinem Fall habe ich nur überprüfen, wenn die Note in einem der drei Schaltflächen und Gegenleistung. In anderen Fällen können Sie mit einfachen Rechteck-basierte bohren nach unten durch die Hierarchie oder komplexer Treffer tests, zum Beispiel zu vermeiden, die die transparenten Bereiche in Ihrem Blick zu erlauben, berührt zu passieren, die Teile. Wenn Sie brauchen, um einen Drilldown,CGRectContainsPoint
verwendet werden kann, die gleiche Weise, ich habe es verwendet, aber denken Sie daran, kompensieren Sie Ihre Punkte in die lokale Ansicht-Koordinaten für jeden view-Ebene, die Sie bohren in.Den
preventSelectionChange
Methode ist, um zu verhindern, dass meine benutzerdefinierten annotation von immer aktiviert, ich benutze es als eine anpassbare/interaktive Legende von Karte, Stifte und hält den pin bezieht sich auf ausgewählte, anstatt die Auswahl zu ändern, um diese Anmerkung.Haben Sie eine Unterklasse MKAnnotationView oder hast du das ändern, setzen Sie einfach die Eigenschaft Bild davon?
Hier ist die Dokumentation für die Einstellung der Bild-Eigenschaft.
Überprüfen Sie die Größe des Rahmens Ihrer Beschriftungsansicht, die ist, wo Ihr Objekt erhalten kann, berührt.
Implementiert habe ich etwas ähnliches in der folgenden Art und Weise
Gestik-Erkennung Unterklasse mit Ihren gesten, wenn Sie führen Sie an jedem beliebigen Punkt im Bild. Dies sollte Ihnen dabei helfen.
Haltet uns auf dem Laufenden, ob diese Lösung funktioniert für u...
@jhabbott Lösung nie für mich gearbeitet, wie ich bereits erwähnt hier.
Habe ich ein Bild und ein label-Seite. Das Bild wurde durch Einstellung annotationview
image
Eigenschaft, und das Etikett, indem einUILabel
Ich umgeleitet
func point(inside:with:)
Methode, um dieUILabel
(die enthalten das image zone) undhitTest
kehrte zurück, genau die gleiche Ansicht, egal ob ich klickte auf die Beschriftung oder das Bild. Aber label auf produzierte keine callback -...Schließlich landete ich durch eine Vergrößerung der MKAnnotationView Rahmen zu umschließen label + Bild, ich
annotationView.image
zunil
, und ich habe meine benutzerdefinierteUIImageView
.Weil ich wollte, dass der Ankerpunkt in der Mitte des Bildes, ich hatte einen benutzerdefinierten eins :
Dann habe ich gelöscht
point(inside:with:)
undhitTest(point:with:)
überschreibt, daß nichts getan.Und jetzt, zum ersten mal, meine Beschriftungsansicht ist völlig reaktiv.