2013-05-12 22 views
5

My MKPointAnnotation powinno być z tym kodem zwyczaj:Dlaczego moja funkcja MKPointAnnotation nie jest niestandardowa?

-(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; 
} 

Jednak z jakiegoś powodu, Pin wciąż domyślnie, może ktoś mi pomóc tutaj? Dzięki

Odpowiedz

10

Nie powinieneś sam dzwonić pod numer viewForAnnotation. Powinieneś dodawać adnotacje tylko do swojego widoku mapy, co pozwoli określić, które z nich są widoczne w danym momencie i zadzwonić pod numer viewForAnnotation. Zatem:

  • Biorąc pod uwagę, że różne adnotacje mogą mieć różne obrazy, naprawdę chcesz do podklasy MKPointAnnotation i nadać mu własność imageName (uwaga, a nie sam UIImage, ale nazwę lub identyfikator viewForAnnotation będą mogli użyć do utworzenia UIImage się):

    @interface MyAnnotation : MKPointAnnotation 
    @property(nonatomic, strong) NSString *imageName; 
    @end 
    
    @implementation MyAnnotation 
    @end 
    
  • dodać adnotację (nie widoku opisu) do MapView, np:

    - (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; 
    } 
    

    Uwaga, nie sugerowałbym robienia Pin klasy ivar/własności, a ja używałbym camelCase do nazw zmiennych (zaczynając od małej litery), zmieniłbym nazwę metody z setAnnotation na coś podobnego do addAnnotationWithTitle itd.

  • Upewnij się, że kontroler został określony jako delegat mapy mapView;

  • Zadzwoń pod numer viewForAnnotation (jeśli adnotacja jest widoczna). Powinno to prawdopodobnie coś takiego:

    - (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; 
    } 
    

    pamiętać, że animatesDrop jest MKPinAnnotationView opcja, że ​​nie można zrobić z widokiem na zlecenie adnotacji. Ale jeśli chcesz, możesz go łatwo wdrożyć (patrz How can I create a custom "pin-drop" animation using MKAnnotationView?). Proponuję najpierw zmierzyć się z podstawowym widokiem adnotacji, a następnie obejrzeć animację upuszczania widoku niestandardowej adnotacji później.

+0

Ale jak mogę zmienić ustawienia dla adnotacji? ponieważ teraz używam takich rzeczy jak: pinView.rightCalloutAccessoryView = PicButton; ale to nie działa –

+0

@BlackMagic Zobacz poprawioną odpowiedź z bardziej kompletnym przykładem kodu. – Rob

+1

Dziękuję bardzo, to było dokładnie to, czego potrzebowałem. –

Powiązane problemy