2009-12-18 7 views
3

J'ai réussi à définir une image personnalisée sur MKAnnotationView pour remplacer les broches (j'ai utilisé la fonction setImage). Mais cela ne fonctionne que lorsque le type MKMapView est "Standard". Les modes Satellite et Hybride affichent toujours les broches.MKAnnotationViews avec l'image en mode carte satellite

Est-ce que quelqu'un a une idée pour résoudre ce problème étrange?

Répondre

0

Etrange, les deux sujets (MKAnnotationView personnalisé et mode carte) ne sont pas liés ensemble.

La façon dont vous remplacez les broches semble étrange (setImage?), La voie « classique » est de mettre en œuvre le

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation

et retourner votre vue d'annotation personnalisée dans votre délégué pour remplir le protocole MKMapViewDelegate.

0

Pour développer la réponse de yonel, vous ne pouvez pas utiliser la propriété setImage de la propriété MKAnnotationView.image déjà créée pour définir une nouvelle image dans la partie principale de votre MapViewController.

Le MapViewController doit avoir mis en œuvre la méthode MKMapViewDelgate:

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

Dans ce document, vous serez informé de la carte lorsqu'une annotation est ajoutée. Donc, pour personnaliser votre annotationView, vous devez étendre MKAnnotation et créer votre propre classe d'annotations. Vous ajoutez simplement cette instance d'annotation personnalisée pour que votre mapView affiche automatiquement une annotation personnalisée (étendue, c'est-à-dire la vôtre) pour ce type d'annotation (par exemple, classe). En d'autres termes, la méthode déléguée vous avertit que l'annotation personnalisée est ajoutée. Dans cette section, vous vérifiez la classe d'annotation et, s'il s'agit de votre classe d'annotations, créez une nouvelle instance de votre annotation personnalisée.

C'est, d'utiliser la méthode d'initialisation de cette classe customAnnotation comme:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)identifier 

Vous devez mettre en œuvre cette méthode vous-même.

Dans cette méthode, vous pouvez utiliser setImage pour définir une image de votre choix. Cela sera utilisé pour cette annotationView. Je suppose que dans votre utilisation, l'image définie a été effacée lors du changement de MapType, probablement parce qu'elle créait une nouvelle instance d'une annotationView pour la carte (qui est une nouvelle carte et qui ajoute à nouveau des annotations et recréer annnotationViews à partir de la méthode déléguée).

Si vous définissez l'image dans la méthode init, elle ne sera pas perdue (car elle est toujours définie pour l'instance).

Est-ce que cela aide?

2

J'ai eu exactement le même problème quand j'ai essayé de changer l'image d'un MKPinAnnotationView. Il semble qu'un appel à setImage n'est pas persistant puisque mapView appelle setImage avec l'image par défaut de temps en temps.La solution consiste à sous-classe MKPinAnnotationView et passer outre setImage pour définir toujours votre image personnalisée:

- (void)setImage:(UIImage *)image { 
    [super setImage:[UIImage imageNamed:@"MyCustomPinImage.png"]]; 
} 
Questions connexes