- 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:
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.