43 votes

Personnaliser la légende MKAnnotationView

Je souhaite créer une légende MKAnnotationView personnalisée, comme indiqué dans cette image. J'ai testé plusieurs solutions mais elles ne permettent que la personnalisation des images gauche / droite et du titre / sous-titre. Quelqu'un peut-il me donner un code source ou un lien de didacticiel?

Actuellement, je suis désemparé. S'il vous plaît aider.

entrez la description de l'image ici

50voto

Jano Points 37593

- Je comprendre que vous voulez un code pin avec un circuit de légende.

Nous ne pouvons pas créer une légende, mais nous pouvons créer une annotation avec une vue personnalisée. Donc, l'astuce est d'ajouter un deuxième annotation lorsque le premier est sélectionné, et de faire de la 2ème vue d'annotation de ressembler à une légende de la bulle.

C'est la solution posté par les utilisateurs djibouti33 et jacob-jennings dans la réponse: MKAnnotationView - Verrouillage personnalisé de la vue d'annotation à la broche sur l'emplacement des mises à jour, qui à son tour est basé dans un billet de blog de l'Asynchronie des Solutions. Pour les besoins de l'explication, voici quelques UML à partir d'un fork du projet: Annotation with custom XIB

C'est un gros hack, mais aussi la façon la plus propre que j'ai vu à la mise en place des annotations.

Commencez avec un NSObject "Contenu" de la classe qui a les coordonnées, la classe de la légende de la vue à utiliser (dans l'UML est AnnotationView, mais vous pouvez en créer de nouveaux et de les mettre ici), et un dictionnaire des valeurs aléatoires avec le titre, l'url de la photo, etc. Utilisez cette classe pour initialiser un MKAnnotation "Annotation" objet.

#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...

@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...

L'Annotation implémente AnnotationProtocol d'annoncer qu'il veut se charge de la création de son propre MKAnnotationView. Voilà, votre MKMapViewDelegate doit avoir un code comme ceci:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
    // if this is a custom annotation, delegate the implementation of the view
    if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) {
        return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView];
    } else {
        // else, return a standard annotation view
        // ...
    }
} 

La vue retournée est de type AnnotationView, qui met en œuvre AnnotationViewProtocol d'annoncer qu'il veut gérer la sélection/désélection. Par conséquent, dans votre carte-vue-contrôleur, les méthodes mapView:didSelectAnnotationView: et mapView:didDeselectAnnotationView: de déléguer de manière similaire à ce que nous avons vu avant.

Lorsque l'annotation est sélectionnée, un deuxième annotation (CalloutAnnotation) est ajoutée, qui suit le même comportement, mais cette fois, la vue retournée (CalloutView) est initialisé à partir d'un XIB, et contient des Graphiques de Base de code (dans BaseCalloutView) d'animer et de répliquer d'une légende.

L'initialiseur de la CalloutView classe:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation
{
    NSString *identifier = NSStringFromClass([self class]);
    self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
    if (self!=nil){
        [[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil];
        // prevent the tap and double tap from reaching views underneath
        UITapGestureRecognizer *tapGestureRecognizer = ...
    }
    return self;
}

Pour être en mesure de pousser un autre point de vue contrôleur de la légende de la vue, j'ai utilisé des notifications.

La DONC réponse j'ai fait un lien en haut contient deux projets de mise en œuvre de ce code (de la classe des noms peuvent différer). J'ai un autre projet à l'aide de l'UML ci-dessus à https://github.com/j4n0/callout.

1voto

Mahesh Points 546

J'ai ajouté UIButton personnalisé dans MKAnnotationView. Et en cliquant sur ce bouton, j'ai montré popOver avec rootViewController avec la vue similaire à celle présentée ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X