Umstellung/Aktualisierung MKOverlay auf MKMapView
gibt es eine Möglichkeit zum update (d.h. sich bewegen) ein MKOverlay
, die bereits Hinzugefügt, um die MKMapView
. Entfernen einer alten und hinzufügen einer neuen ist schrecklich, (langsam).
ich.e ich würde gerne auslösen, die hintergrund-Funktion, wird diese Funktion aufgerufen, wenn ein overlay über den Bildschirm bewegt:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
(mit MKAnnotions
es ein wenig besser denke ich, aber ich nicht verwenden MKPolyline
, MKPolygon
usw. und die ganze information wird reduziert auf einen einzelnen Punkt)
- Zusatz: geben Sie einen Eindruck, wo ich diese Funktion: ich benutze eine Kartenansicht und Ort Anmerkungen auf der Oberseite zeigen die Positionen der Satelliten. Jeder Satellit sollte auch ein Fußabdruck (die Fläche, wo Sie können "finden" des Satelliten über dem Horizont). Diese Informationen (die position und die Form der Aufstandsfläche) muss regelmäßig aktualisiert werden. Im Moment habe ich eine Lösung mit einer Ansicht vor allem Fußspuren, wo ich ziehen mit CoreGraphics die richtigen Formen. Ich hätte aber lieber eine Lösung mit MKOverlay, aber ich kann nicht get Sie zu einem dynamischen... irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
MKOverlayView
hat die folgenden Methoden, die Kraft MapKit neu Rendern der angegebenen mapRect:- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect
- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale
Wenn Sie einen timer (oder periodische HTTP-request oder irgendeine andere Methode für die Bestimmung, dass das overlay aktualisiert werden soll), ruft einer der oben genannten Methoden auf die overlayView dazu, dass es neu Rendern, dass der Punkt auf der Karte (d.h.
-canDrawMapRect:zoomScale:
wird erneut aufgerufen, und dann-drawMapRect:zoomScale:inContext:
wird aufgerufen, wenn der ehemalige, gibt JA).Update:
Wenn Sie nicht sicher sind, was mapRect Sie brauchen, um neu zu erbringen, die Sie könnte der Lage sein, die
MKMapRectWorld
Konstante als mapRect — ich glaube, dazu, dass das overlay über die gesamte Karte neu zu laden (einmal sichtbar).MKOverlayRenderer
, nichtMKOverlayView
.setNeedsDisplay
Verwenden
MKAnnotations
. Sie können ändern, werden die Koordinaten für Sie. Nur deaktivieren Sie alle touch-related stuff. Sie müssten Ihren eigenen code zum zeichnen der Annotationen, OpenGL würde wahrscheinlich den trick tun. Niemand würde den Unterschied kennen.Scheint dies zu zwingen, die Karte zu aktualisieren-overlays. Wahrscheinlich Annotationen als auch.
[self.mapView setCenterCoordinate:selbst.mapView.centerCoordinate];
Hatte ich eigentlich zu zwingen, die overlay-anzeigen, um die Unwirksamkeit der Pfad, löschen Sie den alten Weg vor der Einrichtung einer neuen. [polygonView invalidatePath]. Sagen die map-Ansicht, die es braucht, ein display-refresh war nicht ausreichend für mich.
Swift 3+ update, dieser arbeitete für mich, vielen Dank @zenchemical für die inspiration.
Side note, ich kann nicht helfen Gefühl, dass dies nicht notwendig sein und es wird eine besser geeignete Lösung, jedoch habe ich es nicht gefunden. Auch wenn der add-Befehl ausgelöst wird, um die Haupt-Warteschlange, der überlagerung reproduzierbar nicht machen, bis ich in der map bewegen.
gibt es ein problem mit raw
setNeedsDisplay
wenn das umschließende Rechteck des Polygons ändert, dann MKMapView würde nicht update ganze Rechteck korrekt,und zweitensMKPolygon/MKPolygonRenderer
's polygon ist nicht aktualisierbar,und das problem mit dem hinzufügen/entfernen-pipeline ist, wenn es zu viel Anforderung zum aktualisieren der Kartenansicht kann es langsamer in der pipeline, derzeit nutze ich ein 30Hz-thread-Schleife, wenn ein update im polygon, die ich tun, hinzufügen/entfernen