2010-07-22 3 views
8

existe-t-il un moyen de mettre à jour (c'est-à-dire de se déplacer) un MKOverlay déjà ajouté au MKMapView. Supprimer un ancien et en ajouter un nouveau est terrible (lent).déplacement/mise à jour MKOverlay sur MKMapView

-à-dire je voudrais déclencher la fonction d'arrière-plan qui appelle cette fonction lorsqu'un recouvrement se déplace sur l'écran:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 

(avec MKAnnotions son un peu mieux je pense, mais je ne peux pas utiliser MKPolyline, MKPolygon , etc., et l'ensemble des informations est réduite à un seul point)

+0

En outre: pour vous donner une impression où j'ai besoin de cette fonction: J'utilise un MapView et place des annotations dessus pour montrer les positions des satellites. Chaque satellite devrait également montrer une empreinte (la zone où vous pouvez "voir" le satellite au-dessus de l'horizon). Cette information (la position et la forme de l'empreinte) doit être mise à jour périodiquement. Dans le moment, j'ai une solution avec un View vor all Footprints où je dessine avec CoreGraphics les bonnes formes. Mais je préférerais une solution avec MKOverlay, mais je ne peux pas les obtenir dynamiques ... des idées? – user398877

Répondre

4

MKOverlayView a les méthodes suivantes qui forcent MapKit à nouveau rendu le mapRect suivant:

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect

- (void)setNeedsDisplayInMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale

Si vous utilisez une minuterie (ou requête HTTP périodique ou une sorte d'autre méthode pour déterminer que votre recouvrement doit être mis à jour), appelant l'une des méthodes ci-dessus sur la overlayView causera pour re-rendre cet endroit sur la carte (c.-à-d. -canDrawMapRect:zoomScale: sera appelée à nouveau, puis -drawMapRect:zoomScale:inContext: sera appelée si la première renvoie YES).


Mise à jour:

Si vous n'êtes pas sûr de ce que vous avez besoin mapRect de réengendrer, vous pourrait être en mesure d'utiliser la MKMapRectWorld constante comme mapRect - que je crois causerait la superposition sur toute la carte pour recharger (une fois visible).

+1

Il me semble que ... depuis iOS 7, ces méthodes sont sur MKOverlayRenderer, pas MKOverlayView. – livingtech

+0

Si vous voulez mettre à jour l'ensemble de la carte, vous pouvez simplement appeler 'setNeedsDisplay ' – gcamp

0

Je devais réellement forcer la vue de superposition pour invalider le chemin, pour effacer l'ancien chemin avant d'en configurer un nouveau. [polygonView invalidatePath]. Dire à l'affichage de la carte qu'il a besoin d'une actualisation de l'affichage était insuffisant pour moi.

1

Utilisez MKAnnotations. Vous pouvez changer les coordonnées d'entre eux. Désactivez simplement tout ce qui touche au toucher. Vous auriez besoin de votre propre code de dessin pour dessiner les annotations, OpenGL ferait probablement l'affaire. Personne ne connaîtrait la différence.

+3

AnnotationViews rester la même taille si vous zoomez, les tailles de superposition sont par rapport à l'échelle de zoom à droite?Je dois spécifier un cercle sur la carte qui devrait marquer une zone spécifique (peut-être un parc ou quelque chose). – yuf

0

Cela semble forcer la carte à rafraîchir les superpositions. Probablement des annotations aussi.

[self.mapView setCenterCoordinate: self.mapView.centerCoordinate];

Questions connexes