Comment déplacer un MKAnnotation sans ajouter / retirer de la carte?

voix
31

Est-il possible de déplacer la coordonnée d'un MKAnnotation sans ajout et la suppression de l'annotation de la carte?

Créé 13/02/2010 à 02:44
source utilisateur
Dans d'autres langues...                            


11 réponses

voix
16

J'ai trouvé une méthode assez simple. Je voulais mettre à jour en douceur la position de mon lecteur sans retirer puis ajouter à nouveau l'annotation joueur. Cela fonctionne bien pour les applications pré-iOS4, et ce qu'il fait est à la fois déplacer l'axe et centrer la carte sur le nouvel emplacement de la broche:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[player setCoordinate:aLoc.coordinate];
[mapView setCenterCoordinate:aLoc.coordinate animated:NO];
[UIView commitAnimations];

Voici la même chose, mais en utilisant la fonction de bloc recommandé pour iOS4:

[UIView animateWithDuration:0.5 animations:^{
    [player setCoordinate:aLoc.coordinate];
    [mapView setCenterCoordinate:aLoc.coordinate animated:NO];
}];
Créé 05/07/2010 à 14:47
source utilisateur

voix
6

Il est en effet possible sans enlever et ajouter l'annotation hors cours.

Vous aurez besoin d'observer des coordonnées de votre MKAnnotation et mettre à jour la position du MKAnnotationView lorsqu'il change. Sinon, vous pouvez (et cela est probablement la façon plus élégante de le faire) dériver votre propre MKAnnotation et MKAnnotationView et les rendre « mobile ».

Voir Déménagement-MKAnnotationView pour un exemple détaillé qui anime également la position de l'annotation.

Créé 14/03/2011 à 16:19
source utilisateur

voix
4

MKPointAnnotation et sous-classe a la capacité de mettre à jour la vue d'annotation sur la carte pour les nouvelles coordonnées automatiquement.

Créé 26/04/2014 à 20:17
source utilisateur

voix
4

Il suffit d'utiliser KVO:

[annotation willChangeValueForKey:@"coordinate"];
[annotation didChangeValueForKey:@"coordinate"];

Si votre MKAnnotation a une méthode de setCoordinate, il suffit d'inclure ces lignes là:

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate {
    [self willChangeValueForKey:@"coordinate"];
    coordinate = newCoordinate;
    [self didChangeValueForKey:@"coordinate"];
}
Créé 13/03/2012 à 19:30
source utilisateur

voix
2

Je ne sais pas s'il est plus généralement possible, mais il est si vous avez votre propre MKAnnotationView personnalisé.

Je suis en mesure d'adapter l'approche documentée à http://spitzkoff.com/craig/?p=108 par Craig Spitzkoff:

  1. Donnez votre coutume MKAnnotationView une référence à votre objet MKAnnotation
  2. Ajouter une méthode updateCoordinates à l'objet MKAnnotation et l'appeler quand vous voulez changer l'emplacement de l'annotation
  3. Appelez RegionChanged sur le MKAnnotationView personnalisé pour le laisser savoir quand se repositionner (par exemple lorsque MKAnnotation a mis à jour les coordonnées)
  4. Dans drawRect sur l'objet de vue interne appartenant à votre commande MKAnnotationView vous pouvez repositionner en utilisant les coordonnées du MKAnnotation (vous tenez une référence à elle).

Vous pourriez probablement simplifier davantage cette approche - vous ne pouvez pas exiger un objet vue interne en toutes circonstances.

Créé 15/02/2010 à 04:45
source utilisateur

voix
1

Une fois que vous mettez à jour les coordonnées ou d'autres propriétés de l'annotation, appelez juste après la méthode MKMapViewDelegate pour redessiner l'annotation:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

par exemple:

myAnnotation.coordinate = CLLocationCoordinate2DMake([newLat doubleValue], [newLon doubleValue]);
[self mapView:self.mapView viewForAnnotation:myAnnotation];
Créé 04/07/2014 à 00:51
source utilisateur

voix
1

La plupart des réponses sont basées sur des faits que l' annotation a été faite via MKPlacemark extension. Mais qu'en est- tout autre objet ( par exemple d'image personnalisée pour le marqueur) qui implémente seul protocole MKAnnotation? Il ne serait pas la méthode setCoordinate. Voici donc la réponse basée sur le code, fourni par 100grams

    MKAnnotationView *av = [self.mapView viewForAnnotation:user];
    //user is an object which implements <MKAnnotation>
    // You will probably get your MKAnnotationView in your own way
    if (av){
        // here user returns CLLocationCoordinate2D coordinate  
        MKMapPoint mapPoint = MKMapPointForCoordinate([user getLastLocation]); 
        // converting mapPoint to CGPoint 
        CGPoint newPos;
        CGFloat zoomFactor =  self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
        newPos.x = mapPoint.x/zoomFactor;
        newPos.y = mapPoint.y/zoomFactor;
        // animation for annotation's move
        static NSString *POSITION_KEY=@"positionAnimation";
    static NSString *PATH_ANIMATION_KEY=@"position";
    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:PATH_ANIMATION_KEY];
        animation.fromValue = [NSValue valueWithCGPoint:av.center];
        animation.toValue = [NSValue valueWithCGPoint:newPos];  
        animation.duration = 0.3;
        animation.delegate = av;
        animation.fillMode = kCAFillModeForwards;
        [av.layer addAnimation:animation forKey:POSITION_KEY];
    }
        // moving view
        av.center = newPos;

Vous avez donc besoin essentiellement d'obtenir le MKAnnotationView correspondant qui pourrait être également atteint par itération via l'ensemble des annotations et il est nouvel emplacement. J'ai fait un support de tableau pour tout cela (NSMutableArray * mapAnnotaions) maintenant je pourrais itérer tout comme:

for (id annotation in mapAnnotaions) {call refresh method here for id}
Créé 18/07/2012 à 17:31
source utilisateur

voix
1

Si vous gardez une référence à l'annotation, faire un changement à la coordonnée propriété, puis ajoutez l'annotation à nouveau la carte, l'emplacement de la vue d'annotation mettra à jour. Vous ne devez supprimer l'annotation (qui provoquera la vue d'annotation disparaître momentanément). Cela vous ne donnera pas une belle transition lorsque l'annotation coordonnée est mise à jour cependant. Elle ne donne pas lieu à une fuite de mémoire ne sont là un multiple de la même annotation ajoutée à la carte (si vous regardez le nombre d'annotations sur le MapView, il reste constant lorsque vous ajoutez à nouveau l'annotation).

Créé 16/02/2011 à 14:58
source utilisateur

voix
0

Dans Swift 4.0 et IOS 11.0, ajouter simplement attribut dynamique à la coordonnée propriété de la classe des enfants de la classe MKAnnotation et il fonctionne: toutes les annotations sur MapView mettent à jour leur emplacement si la valeur de coordonnées des objets MKAnnotation sont mis à jour:

class CarAnnotation: NSObject, MKAnnotation {
    @objc dynamic var coordinate: CLLocationCoordinate2D
    //Add your custom code here
}
Créé 15/03/2018 à 09:30
source utilisateur

voix
0

Jetez un oeil à mon MapKitDragAndDrop exemple, il vous permet de mettre à jour MKAnnotation et déplacer MKAnnotationView fois sur iPhone OS 3 et iOS 4 (utilisera glisser un support intégré).

Créé 30/06/2010 à 23:41
source utilisateur

voix
-5

Il ne semble pas possible de modifier les coordonnées d'un objet MKAnnotation puis informer le MKMapView du changement.

Toutefois, la suppression de l'annotation précédente de la carte, en changeant la coordonnée de votre objet d'annotation et l'ajouter retour à la carte fonctionne bien.

[theMapView removeAnnotation:myAnnotation]; 
[myAnnotation setLatitude:newLatitude];
[theMapView addAnnotation:myAnnotation];

Pourquoi ne voulez-vous pas le faire de cette façon?

Créé 13/02/2010 à 12:53
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more