Ich habe ein MKMapView
. Ich habe UITapGestureRecognizer
mit einem einzigen Tap hinzugefügt.
Ich möchte jetzt ein MKAnnotationView
zur Karte hinzufügen. Ich kann die Annotation und mapView:mapView didSelectAnnotationView:view
feuern (wo ich zusätzliche Logik hinzufügen werde, um eine UIView anzuzeigen).
Das Problem ist jetzt, wenn ich auf die Anmerkung tippe, wird auch die MKMapView
Tap Geste ausgelöst.
Kann ich es einstellen, wenn ich auf die Anmerkung tippe, antwortet es nur?
Es könnte eine bessere und sauberere Lösung geben, aber eine Möglichkeit, dies zu tun, ist das Ausnutzen von hitTest:withEvent:
in dem ausgewählten Tip-Gesten-Wähler, z.
Angenommen, Sie haben Ihrem _mapView
Es deckt wahrscheinlich nicht alle Randfälle ab, aber es scheint ziemlich gut für mich zu funktionieren.
UPDATE (iOS & gt; = 6.0)
Schließlich habe ich eine andere Art von Lösung gefunden, die den Nachteil hat, nur für iOS & gt; = 6.0 gültig zu sein: Tatsächlich nutzt diese Lösung das neue -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
, das zu UIView
hinzugefügt wurde. s auf diese Weise
D. h., ab iOS 6 ist es ausreichend, die Methode UIView
in jeder Ansicht zu überschreiben, die der Gestenerkenner ignorieren sollte.
Ihre Lösung sollte die - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
-Methode für Ihren Delegaten verwenden.
Bei dieser Methode können Sie prüfen, ob die Berührung auf einer Ihrer Anmerkungen war, und in diesem Fall return NO
, so dass Ihre gestureRecognizer
nicht aktiviert ist.
Ziel-C:
%Vor%Schnell:
%Vor%Warum nicht einfach UITapGestureRecognazer in viewForAnnotation hinzufügen, verwenden Sie den reuseIdentifier von annotation, um zu identifizieren, um welche Annotation es sich handelt, und in der tapGestureRecognizer-Aktionsmethode können Sie auf diesen Identifikator zugreifen.
%Vor% Ich bin mir nicht sicher, warum Sie ein UITapGestureRecognizer
in Ihrer Kartenansicht haben würden. Sie sagen, dass dies im Klartext bedeutet, dass es mit einigen Multitouch-Funktionen Ihrer Map herumspielen wird.
Ich schlage vor, dass Sie sich die cancelsTouchesInView
-Eigenschaft von UIGestureRecognizer
ansehen und damit herumspielen (siehe Dokumentation ). Ich denke, das könnte dein Problem lösen. Stellen Sie sicher, dass Sie die Dokumentation lesen.
Warnung! Die akzeptierte Lösung und auch die folgende ist manchmal etwas buggy. Warum? Manchmal tippen Sie auf Annotation, aber Ihr Code verhält sich wie beim Tippen auf die Karte. Was ist der Grund dafür? Weil Sie irgendwo um Ihren Rahmen Ihrer Annotation geklopft haben, etwa + - 1-6 Pixel, aber nicht im Rahmen der Anmerkungsansicht.
Interessant ist auch, dass Ihr Code in diesem Fall sagt, dass "Sie die Map, nicht Annotation" Standard-Code-Logik auf MKMapView auch diese enge Berührung akzeptieren, als ob sie in der Annotation-Region wäre und didSelectAnnotation auslösen würde / p>
Sie müssen dieses Problem also auch in Ihrem Code berücksichtigen. Sagen wir, das ist der Standardcode:
%Vor%Und dieser Code berücksichtigt auch einige Näherungsberührungen um Annotationen herum (weil MKMapView, wie gesagt, auch Näherungsberührungen und nicht nur richtige Berührungen akzeptiert):
Ich habe die Log-Funktionen hinzugefügt, damit Sie sie in der Konsole sehen und das Problem verstehen können.
%Vor%Mein Anmerkungsrahmen hat eine Größe von 25x25, deshalb akzeptiere ich einen Abstand von 30. Sie können Ihre Logik anwenden wie if (p.x & gt; = anView.frame.origin.x - 6) & amp; & amp; Y usw. ..
Tags und Links objective-c ios mkmapview mkannotation mkannotationview