2011-01-17 12 views
14

Mam zestaw NSMutableArray obiektów pochodnych od klasy, która jest zgodna z protokołem MKAnnotation. Mam konfiguracji tytuł konfiguracji i napisów dla adnotacji i pomyślnie dodane do MKMapView używając:MKMapView, animateDrop?

[[self customMapView] addAnnotations:locationArray]; 

Co chcę zrobić teraz jest animowanie szpilki spada, początkowo myślałem, że mógłbym zrobić z Opcja 1 , używając tego wszystkiego działa, ale szpilki nie robią animowanej kropli.

// Option1 
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for(MKPinAnnotationView *eachView in views) { 
     [eachView setAnimatesDrop:YES]; 
     [eachView setPinColor:MKPinAnnotationColorPurple]; 
    } 
} 

Mój następny przypuszczenie było spróbować opcja2, to wydaje się działać bardzo dobrze, ale mam dwie kwestie. Tytuł i podtytuł nie są wyświetlane, mój niestandardowy obiekt adnotacji jest przekazywany (widzę go w debugerze), ale zawarte w nim informacje nie trafiają do nowego pin. Po drugie tworzy to nowy zestaw MKAnnotationViews, co dzieje się ze starszymi, czy są problemy z wyciekami pamięci?

// Option2 
//FOR: pinColor YES, animatesDrop YES, LABEL NO 
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation { 
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"]; 
    if (pin == nil) { 
     pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease]; 
    } else { 
     pin.annotation = annotation; 
    } 
    pin.pinColor = MKPinAnnotationColorRed; 
    pin.animatesDrop = YES; 
    return pin; 
} 

EDIT: I zostały rozwiązane brakujący tytuł & podtytuł dodając pin.canShowCallout = YES;

+1

W kodzie opcja 2, gdy trzpień jest tworzona nie będzie miał zestaw adnotacji. Usunąłbym "else" i wstawiłam pin.annotation = linię adnotacji, aby zawsze była ustawiona. – theLastNightTrain

Odpowiedz

32

MKPinAnnotationView jest podklasą MKAnnotationView.

MKAnnotationView to ogólny widok opisu, do którego należy podać obraz i animację, jeśli jest to pożądane.

MKPinAnnotationView to wygodna podklasa MKAnnotationViewView, która automatycznie dostarcza obraz pinezki w wybranym kolorze i animację pinezki upuszczanej na mapę. Ustawiasz właściwość animatesDrop podczas tworzenia widoku w viewForAnnotation i automatycznie będzie ona obsługiwała animację.

Jeśli nie zaimplementujesz viewForAnnotation, zostanie wyświetlony standardowy czerwony pin bez animacji.

Do czasu wywołania funkcji didAddAnnotationViews animacja automatyczna już się zdarzyła i ustawienie tej właściwości nie przynosi żadnego efektu.

Jeśli jednak chcesz utworzyć niestandardową animację inną niż domyślna animacja kropli udostępniana przez MKPinAnnotationView, możesz to zrobić w widokach didAddAnnotationView. Widok będzie już w jego ostatecznym punkcie docelowym, więc zapisz go, a następnie animuj z innego punktu do tego miejsca docelowego.

Jeśli jesteś zadowolony z domyślnej animacji kropli udostępnionej przez MKPinAnnotationView, nie musisz implementować didAddAnnotationViews. Ta metoda delegowania jest bardziej przydatna do robienia innych rzeczy, które możesz potrzebować, gdy wszystkie widoki adnotacji są rzeczywiście na miejscu.

Aby umieścić szpilki w tytule, ustaw canShowCallout na YES, w którym ustawiono animatesDrop.

Nie jestem pewien, co masz na myśli przez "tworzy nowy zestaw MKAnnotationViews". W metodzie viewForAnnotation zapewniasz widok (MKPinAnnotationView) dla obiektu MKAnnotation. To nie to samo.

Również metoda viewForAnnotation działa jak metody cellForRowAtIndexPath dla UITableView gdzie adnotacji widoki może się recyklingowi, dlatego ważne jest, aby ustawić MKAnnotation-konkretne informacje w widoku za każdym razem (na przykład jako własność adnotacji).

+0

Dziękuję aBitObvoius, idealna odpowiedź. W odniesieniu do MKAnnotationViews myliłem się myśląc, że jeśli nie zaimplementujesz viewForAnnotation (gdzie otrzymasz domyślne czerwone pinezki), to może już tam był MKAnnotationView utworzony gdzieś i przez późniejszą implementację może być potrzebne zrobienie czegoś ze starym jeden. – fuzzygoat

+0

OK, implementując viewForAnnotation, zastępujesz domyślny widok, więc nie ma duplikacji. – Anna

+0

Mam to, doceniam, jeszcze raz dziękuję za bardzo pomocną odpowiedź. – fuzzygoat

11

Oto najprostsze rozwiązanie, jakie mogłem znaleźć. To, co robi, upuszcza pojedynczą szpilkę na zdarzenie UIMapView w zdarzeniu viewDidLoad.

  1. Projekt odwołuje MapKit ramowego

  2. Widok są następujące importu: #import <MapKit/MapKit.h>

  3. Sterownik widok realizuje protokół MKMapViewDelegate

  4. Realizacja widok sterownik zawiera:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation 
{ 
    MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"]; 
    newAnnotation.pinColor = MKPinAnnotationColorGreen; 
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = NO; 
    [newAnnotation setSelected:YES animated:YES]; 
    return newAnnotation; 
} 
  1. viewDidLoad zawiera:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324); 
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil]; 
[mapView addAnnotation:marker]; 
[marker release]; 
+1

W viewForAnnotation:, powinieneś użyć mapView.dequeueReusableAnnotationViewWithIdentifier, w ten sam sposób, w jaki używałbyś dequeueReusableCellWithIdentifier w tableView. W przeciwnym razie nadal tworzysz MKAnnotacje z identyfikatorem ponownego wykorzystania, którego w rzeczywistości nie używasz ponownie. –

+0

Wybieracie adnotację w widokuForAnnotation, która wydaje się raczej bezsensowna. – Andy

0

Aktualizacja Swift3:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

    if annotation is MKUserLocation { 
    return nil 
    } 

    let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation") 
    pinAnnotation.pinTintColor = .green; 
    pinAnnotation.animatesDrop = true; 
    pinAnnotation.canShowCallout = false; 
    pinAnnotation.setSelected(true, animated: true) 

    return pinAnnotation 
}