2011-11-05 22 views
41

Desidero creare un callout MKAnnotationView personalizzato come mostrato in questa immagine. Ho provato diverse soluzioni ma consentono solo la personalizzazione delle immagini sinistra/destra e del titolo/sottotitolo. Qualcuno può darmi qualche codice sorgente o un link tutorial per questo?Personalizza il callout MKAnnotationView

Attualmente non ho capito. Per favore aiuto.

enter image description here

+0

Penso che questa sia solo una visualizzazione personalizzata con un pin personalizzato, qual è il tuo vero problema? – Mat

+1

Ottima domanda .. Mi aiuta anche .. Grazie mille Jennis .. –

+0

Esempio di demo - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai

risposta

49

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: Annotation with custom XIB

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.

+0

Ciao, Grazie per il meraviglioso lavoro che hai svolto. Sto provando a creare un'annotazione perché due pulsanti in esso. Quando clicco sul pulsante, viene chiamato il metodo handleTouch della mia sottoclasse CalloutView. Ma il mittente è un UITapGestureRecognizer con l'annotazione nella proprietà della vista che dovevo avere il mio pulsante nel sender.view? È un problema ben noto. O sto facendo qualcosa di sbagliato? –

+0

Sì, è noto, controllare https://github.com/j4n0/callout/issues/1 per una soluzione. – Jano

+0

sto affrontando problemi per implementare questo codice nessuno può aiutarmi .. –

0

Ho aggiunto UIButton personalizzato in MKAnnotationView. E al clic di quel pulsante ho mostrato popOver con rootViewController con la vista simile a quella mostrata sopra.

Problemi correlati