Ich arbeite derzeit mit dem Mapkit und stecke fest.
Ich habe eine benutzerdefinierte Anmerkungsansicht, die ich verwende, und ich möchte die Bildeigenschaft verwenden, um den Punkt auf der Karte mit meinem eigenen Symbol anzuzeigen. Ich habe das gut funktioniert. Ich möchte aber auch die Standard-Callout-Ansicht überschreiben (die Blase, die mit dem Titel / Untertitel angezeigt wird, wenn das Anmerkungssymbol berührt wird). Ich möchte in der Lage sein, das Callout selbst zu steuern: Das Mapkit bietet nur Zugriff auf die linken und rechten zusätzlichen Callout-Ansichten, aber keine Möglichkeit, eine benutzerdefinierte Ansicht für die Callout-Blase bereitzustellen oder ihr eine Größe von Null oder etwas anderes zuzuweisen.
Meine Idee war es, selectAnnotation / deselectAnnotation in my zu überschreiben MKMapViewDelegate
und dann meine eigene benutzerdefinierte Ansicht zu zeichnen, indem ich meine benutzerdefinierte Anmerkungsansicht aufrufe. Dies funktioniert, aber nur dann , wenn canShowCallout
festgelegt ist YES
in meiner benutzerdefinierten Anmerkungsansicht Klasse. Diese Methoden werden NICHT aufgerufen, wenn ich diese Einstellung auf gesetzt habe NO
(was ich möchte, damit die Standard-Callout-Blase nicht gezeichnet wird). Ich kann also nicht wissen, ob der Benutzer meinen Punkt auf der Karte berührt (ausgewählt) oder einen Punkt berührt hat, der nicht Teil meiner Anmerkungsansichten ist (gelöscht), ohne dass die Standardansicht der Callout-Blase angezeigt wird.
Ich habe versucht, einen anderen Weg einzuschlagen und alle Berührungsereignisse selbst in der Karte zu behandeln, und ich kann das anscheinend nicht zum Laufen bringen. Ich habe andere Beiträge zum Abfangen von Berührungsereignissen in der Kartenansicht gelesen, aber sie sind nicht genau das, was ich möchte. Gibt es eine Möglichkeit, in die Kartenansicht zu graben, um die Beschriftungsblase vor dem Zeichnen zu entfernen? Ich bin ratlos.
Irgendwelche Vorschläge? Vermisse ich etwas Offensichtliches?
Antworten:
Es gibt eine noch einfachere Lösung.
Erstellen Sie eine benutzerdefinierte
UIView
(für Ihr Callout).Erstellen Sie dann eine Unterklasse von
MKAnnotationView
und überschreiben Sie diesesetSelected
wie folgt:Boom, Arbeit erledigt.
quelle
detailCalloutAccessoryView
In den alten Tagen war dies ein Schmerz, aber Apple hat es gelöst. Überprüfen Sie einfach die Dokumente auf MKAnnotationView
Wirklich, das war's. Nimmt jede UIView.
quelle
Wenn Sie von @ TappCandys genial einfacher Antwort fortfahren und Ihre Blase auf die gleiche Weise wie die Standardblase animieren möchten, habe ich diese Animationsmethode erstellt:
Es sieht ziemlich kompliziert aus, aber solange der Punkt Ihrer Callout-Blase in der Mitte unten liegt, sollten Sie nur in der Lage sein, sie zu ersetzen
myBubbleWidth
undmyBubbleHeight
mit Ihrer eigenen Größe zu versehen, damit sie funktioniert. Denken Sie auch daran, dass für Ihre Unteransichten dieautoResizeMask
Eigenschaft 63 (dh "alle") festgelegt ist, damit sie in der Animation korrekt skaliert werden.: -Joe
quelle
CABasicAnimation
... Zu lange her, um mich zu erinnern! Ich weiß, dass ich aufgrund des Mittelversatzes auch die y-Eigenschaft animieren müsste.CGRectMake
?Ich fand das die beste Lösung für mich. Sie müssen etwas Kreativität einsetzen, um Ihre eigenen Anpassungen vorzunehmen
In Ihrer
MKAnnotationView
Unterklasse können Sie verwendenUnd wenn das ein
subview
istUICalloutView
, dann kannst du damit herumdrehen und was drin ist.quelle
if ([[[subview class] description] isEqualToString:@"UICalloutView"])
Ich denke, es gibt einen besseren Weg, aber das funktioniert.Ich hatte das gleiche Problem. Es gibt eine Reihe von Blog-Posts zu diesem Thema in diesem Blog http://spitzkoff.com/craig/?p=81 .
Nur die Verwendung von
MKMapViewDelegate
hilft Ihnen hier nicht weiter und das UnterklassenMKMapView
und der Versuch, die vorhandene Funktionalität zu erweitern, hat auch bei mir nicht funktioniert.CustomCalloutView
Am Ende habe ich mein eigenes geschaffen , das ich über meinem habeMKMapView
. Sie können diese Ansicht beliebig gestalten.My
CustomCalloutView
hat eine ähnliche Methode wie diese:Es nimmt ein
MKAnnotation
Objekt und setzt seinen eigenen Titel. Anschließend ruft es zwei andere hässliche Methoden auf, die die Breite und Größe des Callout-Inhalts anpassen und anschließend die Sprechblase an der richtigen Position um das Objekt ziehen.Schließlich wird die Ansicht als Unteransicht zur mapView hinzugefügt. Das Problem bei dieser Lösung besteht darin, dass es schwierig ist, das Callout an der richtigen Position zu halten, wenn die Kartenansicht gescrollt wird. Ich verstecke nur das Callout in der Delegate-Methode für Kartenansichten für eine Regionsänderung, um dieses Problem zu lösen.
Es hat einige Zeit gedauert, um all diese Probleme zu lösen, aber jetzt verhält sich das Callout fast wie das offizielle, aber ich habe es in meinem eigenen Stil.
quelle
Um dies zu lösen, muss man grundsätzlich: a) verhindern, dass die Standard-Callout-Blase auftaucht. b) Finden Sie heraus, auf welche Anmerkung geklickt wurde.
Ich konnte dies erreichen, indem ich: a) canShowCallout auf NO setzte b) Unterklassen, MKPinAnnotationView und die Methoden touchBegan und touchEnd überschrieb.
Hinweis: Sie müssen die Berührungsereignisse für MKAnnotationView und nicht für MKMapView verarbeiten
quelle
Ich habe mir gerade einen Ansatz ausgedacht, die Idee hier ist
Hier - Testansicht ist eine
UIView
Größe von 320x100 - ShowCallout ist BOOL -[self animateIn];
ist die Funktion, mit der Animationen angezeigt werdenUIAlertView
.quelle
Sie können leftCalloutView verwenden und annotation.text auf @ "" setzen.
Nachfolgend finden Sie den Beispielcode:
quelle
Ich habe meine Gabelung des hervorragenden SMCalloutView herausgeschoben, das das Problem löst, indem eine benutzerdefinierte Ansicht für Beschriftungen bereitgestellt wird und flexible Breiten / Höhen ziemlich schmerzlos möglich sind. Es gibt noch einige Macken zu lösen, aber es ist bisher ziemlich funktional:
https://github.com/u10int/calloutview
quelle