2013-02-21 13 views
5

Nella vista MKMap ho personalizzato il pin di annotazione con un'immagine. Ma ancora alcuni pin sono statici e non mostrano l'immagine data.Mostra immagini pin diverse in MKMapview

Sto usando - (MKAnnotationView *) MapView: (MKMapView *) MapView viewForAnnotation: (id) annotazione per impostare l'immagine perno.

Aggiunta il mio codice e schermo qui:

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


if ([annotation isKindOfClass:[MKUserLocation class]]) 
    return nil; 

static NSString* AnnotationIdentifier = @"AnnotationIdentifier"; 
MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc] 
           initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier]; 
pinView.animatesDrop=YES; 
pinView.canShowCallout=YES; 
    pinView.pinColor= MKPinAnnotationColorGreen; 

    pinView.enabled = YES; 
    pinView.canShowCallout = YES; 
    pinView.image=[UIImage imageNamed:@"bublerest.png"]; //here I am giving the image 





UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
[rightButton setTitle:annotation.title forState:UIControlStateNormal]; 
[rightButton addTarget:self 
       action:@selector(showDetails:) 
     forControlEvents:UIControlEventTouchUpInside]; 

    pinView.rightCalloutAccessoryView = rightButton; 

UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rest_image2.png"]]; 
pinView.leftCalloutAccessoryView = profileIconView; 


return pinView; 
} 

enter image description here

Tutte le idee?

+0

Riesci a vedere le tue icone mappa personalizzate per qualsiasi pin o solo alcuni pin non li mostra? – Zhang

risposta

11

Se si desidera un'immagine diversa sullo MKAnnotationView rispetto al "Pin" di mele, è necessario utilizzare uno MKAnnotationView anziché uno MKPinAnnotationView.

MKPinAnnotationView non è pensato per essere personalizzato in questo modo e continuerà a mostrare il Pin di volta in volta. Il Class Reference indica che solo pinColor e animatesDrop devono essere modificati.

Perderai comunque l'animazione e l'ombra di PinAnnotationView.

+1

Mentre le altre risposte qui danno tutti i modi per personalizzare l'immagine, solo questa in realtà indica qual è il problema e come risolverlo. – Craig

+0

Ho riscontrato questo problema (immagine pin Apple invece dell'immagine pin) in iOS9. Dopo il tuo suggerimento ora funziona bene! Grazie – Fulkron

+0

Se vuoi che i pin Apple (iPin?) E la tua immagine personalizzata vengano visualizzati sulla stessa mappa, utilizza un'annotazione personalizzata e aggiungi un indicatore per il "tipo" di annotationView richiesto (normale o Pin). Quindi deselezionare una vista di annotazione o pinAnnotationView in base al tipo e gestire separatamente i due casi. – Larry

1

Registrare un frammento di esempio che ho utilizzato in un progetto recente. Spero che questo ti aiuti.

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

Annotation *annotationInst = (Annotation*)annotation; 

MKAnnotationView *pinView = nil; 
if(annotation != mapView.userLocation) 
{ 
    static NSString *defaultPinID = @"pinId"; 
    pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 

    if (pinView == nil){ 
     pinView = [[[MKAnnotationView alloc] 
        initWithAnnotation:annotation reuseIdentifier:defaultPinID]autorelease];   
    } 


    pinView.canShowCallout = YES; 
    pinView.image = [UIImage imageNamed:LOCATION_BUBBLE]; 

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    pinView.rightCalloutAccessoryView = rightButton; 
}  
return pinView;  
} 
1

Utilizzare questo viewForAnnotation

if ([annotation isKindOfClass:[MyAnnotation class]]) { 
    // try to dequeue an existing pin view first 
    static NSString* myAnnotationIdentifier = @"MyAnnotationIdentifier"; 

    // If an existing pin view was not available, create one 
    MKPinAnnotationView* customPinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:myAnnotationIdentifier]; 

    if ([(MyAnnotation *)annotation ann] == AnnotationTypeStart) { 
     NSLog(@"In Start"); 
     customPinView.enabled = NO; 
     customPinView.image = [UIImage imageNamed:@"begin.png"]; 
    } 
} 

dove MyAnnotation viene implementato come sotto

typedef enum AnnotationType { 
    AnnotationTypeStart, 
    AnnotationTypeEnd, 
    AnnotationTypeWayPoint, 
} AnnotationType; 

@interface MyAnnotation : NSObject <MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle; 
    AnnotationType ann; 
} 
2

creare una proprietà nel protocollo MKAnnotation che verrà utilizzata per impostare il perno es

@interface AddressAnnotation1 : NSObject<MKAnnotation> { 
} 
@property (nonatomic, retain) NSString *mPinColor; 

Nel file di implementazione del file .m

- (NSString *)pincolor{ 
    return mPinColor; 
} 

- (void) setpincolor:(NSString*) String1{ 
    mPinColor = String1; 
} 

Quando si aggiunge il annotation, impostare anche il colore pin.

#pragma mark annotation delegate 
- (MKAnnotationView *) mapView:(MKMapView *)mapView1 viewForAnnotation:(AddressAnnotation1 *) annotation 
{ 
    UIImage *anImage = nil; 

    MKAnnotationView *annView=(MKAnnotationView*)[mapView1 dequeueReusableAnnotationViewWithIdentifier:@"annotation"]; 
    if(annView==nil){ 
     annView=[[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation"] autorelease]; 
    } 
    if([annotation.mPinColor isEqualToString:@"green"]) 
    { 
     anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google map pin 02.png" ofType:nil]]; 
    } 
    else if([annotation.mPinColor isEqualToString:@"red"]) 
    { 
     anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google map pin 01.png" ofType:nil]]; 
    } 
    else if([annotation.mPinColor isEqualToString:@"blue"]) 
    { 
     anImage=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Google map pin 02.png" ofType:nil]]; 
    } 
    annView.image = anImage; 
return annView; 
} 

Se non si desidera che le immagini personalizzate per i perni sostituire il corpo di istruzioni condizionali con

annView.pinColor = MKPinAnnotationColorGreen; 

o

annView.pinColor = MKPinAnnotationColorRed; 

o

annView.pinColor = MKPinAnnotationColorPurple; 

ho implementato questo prima. Quindi provaci.

+0

Grazie, è una buona idea :) –

+0

Questo codice dovrebbe funzionare bene, ma nel mio progetto non funziona. Sto anche caricando un KML nella mappa. –

Problemi correlati