capisco che vuoi un perno con una didascalia personalizzata.
Non è possibile creare un callout personalizzato, ma è possibile creare un'annotazione con una vista completamente personalizzata. Quindi il trucco è aggiungere una seconda annotazione quando il primo è selezionato e rendere la seconda vista di annotazione simile a una bolla di callout.
Questa è la soluzione postato dagli utenti djibouti33 e jacob-jennings la risposta: MKAnnotationView - Lock custom annotation view to pin on location updates, che a sua volta si basa in un blog post da Asynchrony Solutions. A scopo di spiegazione, ecco alcuni UML di un progetto biforcuto: 
Questo è un grande hack, ma anche il modo più pulito che ho visto per implementare annotazioni personalizzate.
Inizia con una classe "Contenuto" NSObject che ha una coordinata, la classe della vista di callout da utilizzare (in UML è AnnotationView, ma è possibile crearne di più e impostarli qui) e un dizionario di valori casuali con il titolo, l'url della foto, ecc. Usare questa classe per inizializzare un oggetto "Annotazione" MKAnnotation.
#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...
@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...
l'annotazione implementa AnnotationProtocol di annunciare che vuole gestire la creazione di un proprio MKAnnotationView. Cioè, il tuo MKMapViewDelegate dovrebbe avere codice come questo:
- (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 vista restituito sarà di tipo AnnotationView, che implementa AnnotationViewProtocol di annunciare che vuole gestire la selezione/deselezione. Pertanto, nel tuo controller della vista mappa, i metodi mapView: didSelectAnnotationView: e mapView: didDeselectAnnotationView: dovrebbero delegare in modo simile a quello che abbiamo visto prima.
Quando l'annotazione è selezionata, viene aggiunta una seconda annotazione (CalloutAnnotation), che segue lo stesso comportamento, ma questa volta la vista restituita (CalloutView) viene inizializzata da un XIB e contiene il codice di grafica principale (in BaseCalloutView) a animare e replicare un callout.
L'inizializzatore della classe CalloutView:
- (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;
}
Per poter spingere un altro controllore vista dal richiamo ho usato notifiche.
La risposta SO che ho collegato in alto contiene due progetti completi che implementano questo codice (i nomi delle classi possono essere diversi). Ho un altro progetto che utilizza l'UML sopra allo https://github.com/j4n0/callout.
Penso che questa sia solo una visualizzazione personalizzata con un pin personalizzato, qual è il tuo vero problema? – Mat
Ottima domanda .. Mi aiuta anche .. Grazie mille Jennis .. –
Esempio di demo - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai