2013-05-12 13 views
5

mio MKPointAnnotation dovrebbe con questo codice essere personalizzato:Perché il mio MKPointAnnotation non è personalizzato?

-(MKPointAnnotation*)setAnnotation: (NSString*) title atLocation:(CLLocationCoordinate2D)Location withImage:(UIImage*) LocationImage{ 
    Pin = [[MKPointAnnotation alloc] init]; 
    Pin.title = title; 
    [Pin setCoordinate:Location]; 
    [self mapView:mapView viewForAnnotation:Pin].annotation = Pin; 
    return Pin; 
} 



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

     MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"]; 


     if(!pinView){ 
      pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"]; 
      pinView.animatesDrop = YES; 
      pinView.canShowCallout = YES; 
      pinView.enabled = YES; 
      UIButton *PicButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [PicButton addTarget:self action:@selector(showLocationPicture) forControlEvents:UIControlEventTouchUpInside];\ 
      pinView.rightCalloutAccessoryView = PicButton; 
     } 
     else{ 
      pinView.annotation = annotation; 
     } 
    return pinView; 
} 

Eppure, per qualche ragione, il PIN è ancora difetto, qualcuno mi può aiutare qui? Grazie

risposta

10

Non si dovrebbe chiamare viewForAnnotation da soli. Dovresti aggiungere solo annotazioni alla tua vista mappa, che determinerà quali sono visibili in un dato momento e chiamerai per te viewForAnnotation. Così:

  • Dato che diverse annotazioni possono avere immagini diverse, si vuole veramente sottoclasse MKPointAnnotation e dargli una proprietà del imageName (si noti, non il UIImage in sé, ma un nome o un identificatore che viewForAnnotation sarà in grado da utilizzare per creare la UIImage stesso):

    @interface MyAnnotation : MKPointAnnotation 
    @property(nonatomic, strong) NSString *imageName; 
    @end 
    
    @implementation MyAnnotation 
    @end 
    
  • aggiungere un'annotazione (non una vista annotazione) al vostro mapview, ad esempio:

    - (id<annotation>)addAnnotationWithTitle:(NSString *)title coordinate:(CLLocationCoordinate2D)coordinate imageName:(NSString *)imageName 
    { 
        MyAnnotation *annotation = [[MyAnnotation alloc] init]; 
        annotation.title = title; 
        annotation.coordinate = coordinate; 
        annotation.imageName = imageName; 
        [mapView addAnnotation:annotation]; 
        return annotation; 
    } 
    

    Nota, non suggerirei di creare Pin una classe ivar/proprietà, e io userei camelCase per i nomi delle variabili (inizia con lettere minuscole), cambierei il nome del metodo da setAnnotation a qualcosa come addAnnotationWithTitle, ecc.

  • Assicurarsi che il controller sia stato specificato come delegato di mapView;

  • Il viewForAnnotation verrà chiamato per te (se l'annotazione è visibile). Si dovrebbe probabilmente essere qualcosa di simile:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
    { 
        if ([annotation isKindOfClass:[MKUserLocation class]]) 
         return nil; 
    
        if ([annotation isKindOfClass:[MyAnnotation class]]) 
        { 
         MyAnnotation *customAnnotation = annotation; 
    
         static NSString *annotationIdentifier = @"MyAnnotation"; 
         MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 
         if (!annotationView) 
         { 
          annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier]; 
          annotationView.canShowCallout = YES; 
          annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
         } 
         else 
         { 
          annotationView.annotation = annotation; 
         } 
    
         annotationView.image = [UIImage imageNamed:customAnnotation.imageName]; 
    
         return annotationView; 
        } 
    
        return nil; 
    } 
    

    nota, il animatesDrop è un'opzione MKPinAnnotationView che non si può fare con una vista di annotazione personalizzate. Ma è facile implementarne uno se lo vuoi (vedi How can I create a custom "pin-drop" animation using MKAnnotationView?). Ti suggerisco di affrontare prima la vista di annotazione di base e poi guardare l'animazione di visualizzazione della vista personalizzata in seguito.

+0

Ma come regolare le impostazioni per l'annotazione, quindi? perché adesso uso cose come: pinView.rightCalloutAccessoryView = PicButton; ma questo non funziona o –

+0

@BlackMagic Vedi la mia risposta rivista con un esempio di codice più completo. – Rob

+1

Grazie mille, era esattamente ciò di cui avevo bisogno. –