MKAnnotationView und tippen Sie auf Erkennung

8

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?

    
Padin215 19.06.2013, 20:41
quelle

5 Antworten

5

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

einen Tippgeste-Erkenner hinzugefügt %Vor%

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

%Vor%

D. h., ab iOS 6 ist es ausreichend, die Methode UIView in jeder Ansicht zu überschreiben, die der Gestenerkenner ignorieren sollte.

    
HepaKKes 20.06.2013, 00:19
quelle
4

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%     
Sandy Chapman 04.01.2016 13:51
quelle
1

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%     
Frane Poljak 11.02.2015 15:59
quelle
0

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.

    
Daniel 19.06.2013 21:36
quelle
0

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. ..

    
luky 15.08.2016 13:32
quelle