2009-07-27 8 views
9

Une annotation personnalisée est mise à jour avec de nouvelles coordonnées. Mais le problème est qu'il ne se met à jour visuellement qu'après quelques manipulations avec MKMapView, par ex. zoomer ou déplacer. Que dois-je faire pour mettre à jour manuellement la position visuelle sur une carte?Actualisation de MKMapView après le déplacement de la punaise

PS. J'ai essayé de changer de région pour la région de la carte actuelle. Mais cela change le zoom. C'est étrange.

[mapView setRegion:[mapView region] animated:YES]; 
+0

Veuillez voir ma réponse au lien suivant: http://stackoverflow.com/a/24564868/665961 –

Répondre

19

Je suis un peu shoked après des heures de recherche. La réponse est juste:

[mapView setCenterCoordinate:mapView.region.center animated:NO]; 

Ne me demandez pas pourquoi, mais il met à jour une carte et c'est ce dont j'avais besoin.

+1

UPD: cela n'aide pas avec le SDK 3.1. Toujours en recherche. – slatvick

+1

Ne fonctionne pas dans 3.1.2 non plus. – bradheintz

+0

Cela vient de corriger mon bug! Merci!!!!! –

-7

Voici l'interface MapAnnotation:

// CSMapAnnotation.h 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h>  

// types of annotations for which we will provide annotation views. 
typedef enum { 
    MapAnnotationTypeStart = 0, 
    MapAnnotationTypeEnd = 1, 
    MapAnnotationTypeImage = 2 
} MapAnnotationType; 

@interface MapAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D _coordinate; 
    MapAnnotationType  _annotationType; 
    NSString*    _title; 
    NSString*    _subtitle; 
    NSString*    _userData; 
    NSString*    speed; 
    NSString*    identifier; 
} 

@property (nonatomic, retain) NSString *speed; 
@property (nonatomic, retain) NSString *identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speed 
    identifier: (NSString *) identifier;  
-(id) setWithCoordinate: (CLLocationCoordinate2D) coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speed 
    identifier: (NSString*) identifier;  
@property MapAnnotationType annotationType; 
@property (nonatomic, retain) NSString* userData;  
@end  

Et voici la mise en œuvre:

// CSMapAnnotation.m 
// mapLines 
// Created by Craig on 5/15/09. 
// Copyright 2009 Craig Spitzkoff. All rights reserved. 

#import "MapAnnotation.h"  

@implementation MapAnnotation 

@synthesize coordinate  = _coordinate; 
@synthesize annotationType = _annotationType; 
@synthesize userData  = _userData; 
@synthesize speed; 
@synthesize identifier; 

-(id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*)title 
    subtitle: (NSString*) subtitle 
    speed: (NSString *) speedz 
    identifier: (NSString *) identifierz 
{ 
    self = [super init]; 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz; 
    return self; 
}  
-(id) setWithCoordinate:(CLLocationCoordinate2D)coordinate 
    annotationType: (MapAnnotationType) annotationType 
    title: (NSString*) title 
    subtitle: (NSString*) subtitle 
    speed: (NSString*) speedz 
    identifier: (NSString*) identifierz 
{ 
    _coordinate = coordinate; 
    _title = [title retain]; 
    _subtitle = [subtitle retain]; 
    _annotationType = annotationType; 
    speed = speedz; 
    identifier = identifierz;  
    return self; 
}  
-(NSString*) title 
{ 
    return _title; 
}  
-(NSString*) subtitle 
{ 
    return _subtitle; 
}  
-(void) dealloc 
{ 
    [_title release]; 
    [_userData release]; 
    [super dealloc]; 
}  
@end 
12

MKMapView observe la coordonnée propriété des annotations via KVO. Vous devez simplement respecter le protocole KVO approprié et envoyer l'annotation willChangeValueForKey: et didChangeValueForKey: avec le code d'accès @"coordinate" avant et après la mise à jour des coordonnées.

De même, title et subtitle sont également observés par MKMapView. donc si vous mettez à jour ceux-ci et souhaitez la valeur dans la légende de changer automatiquement, sans aucun effort de votre part, faites la même chose: appeler willChangeValueForKey: et didChangeValueForKey:

+0

C'est vraiment bon à savoir, merci. – samvermette

+0

Alors que le 'setCenterCoordinate: animated:' fonctionne, la méthode KVO fonctionne également ici et est certainement plus appropriée et permet au 'MKMapView' de mieux coordonner les mises à jour à partir de plusieurs observations. –

-2

Il n'y a aucune raison que vous ne pouvez pas supprimer, puis ajouter à nouveau l'annotation . C'est probablement beaucoup plus performant que de déplacer la carte entière, même si c'est un faux mouvement.

+0

Quelqu'un veut expliquer pourquoi cela a été downvoted? C'est à tout le moins une alternative et je dirais que c'est plus performant. –

+0

Je suis sûr que la plupart des gens qui ont trouvé ce fil avaient déjà essayé cela; Je sais que je l'ai fait. Cela provoque un comportement bizarre. –

2

La réponse ici n'est PAS de rafraîchir MapView ou l'annotation!

la propriété de coordonnée de MKAnnotation a KVO dessus. Si vous ajoutez juste le pointeur d'id, de l'objet que vous voulez sur la carte, au mapview et mettez à jour la propriété de coordonnée avec un nouvel emplacement, MKMapView fera le repos pour vous.

Aussi près que possible d'un déjeuner gratuit!

9

Si vous ajoutez vos annotations à partir d'un fil, cela ne fonctionnera pas. i eu le même problème et enveloppant juste ma fonction qui ajoutait les annotations avec ce qui suit travaillé

[self performSelectorOnMainThread:@selector(addCameraIconOnMain:) obj waitUntilDone:true]; 

-(void) addCameraIconOnMain:(myobjecttype*)obj 
{ 
    // this isnt the entire function, customize for your own purpose..... 
    [mapView addAnnotation:annotation]; 
} 
0

Je résolu cette erreur avec un appel asynchrone, au moins 0,5 retard.

.: [self performSelector:@selector(redrawPins) withObject:nil afterDelay:0.5]; par exemple

Où "redrawPins" est la fonction qui ajoute et supprime les broches.

Questions connexes