2011-01-17 13 views
14

Ich habe ein NSMutableArray von Objekten eingerichtet, die von einer Klasse abgeleitet sind, die dem MKAnnotation-Protokoll entspricht. Ich habe Setup Setup-Titel und Untertitel für die Annotation und haben sie erfolgreich an den MKMapView mit hinzugefügt:MKMapView, animateDrop?

[[self customMapView] addAnnotations:locationArray]; 

Was ich will jetzt tun animieren die Stifte fallen, zunächst dachte ich, ich könnte das tun, mit Option1 Mit diesem funktioniert alles, aber die Pins machen keinen animierten Drop.

// 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]; 
    } 
} 

Meine nächste Vermutung Option2 zu versuchen war, scheint dies zu funktionieren sehr gut, aber ich habe zwei Fragen. Der Titel und der Untertitel werden nicht angezeigt, mein benutzerdefiniertes Anmerkungsobjekt wird übergeben (ich kann es im Debugger sehen), aber die enthaltenen Informationen machen es nicht für den neuen pin verfügbar. Zweitens erzeugt dies eine neue Reihe von MKAnnotationViews, was passiert mit den alten, gibt es Probleme mit Speicherlecks?

// 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: ich die fehlenden Titel & Subtitle gelöst durch pin.canShowCallout = YES;

+1

In Ihrer Option 2-Code, wenn der Stift erstellt wird, wird es nicht die Anmerkung gesetzt haben. Ich würde das "else" entfernen und die pin.annotation = Annotationslinie einrücken, so dass es immer gesetzt wird. – theLastNightTrain

Antwort

32

MKPinAnnotationView ist eine Unterklasse von MKAnnotationView Zugabe.

MKAnnotationView ist eine allgemeine Anmerkungsansicht, für die Sie bei Bedarf das Bild und die Animation bereitstellen müssen.

MKPinAnnotationView ist eine praktische Unterklasse von MKAnnotationView, die automatisch ein Pin-Bild in einer ausgewählten Farbe und eine Animation des Stifts auf die Karte liefert. Sie legen die animatesDrop -Eigenschaft beim Erstellen der Ansicht in viewForAnnotation fest, und die Animation wird von dort automatisch verarbeitet.

Wenn Sie viewForAnnotation nicht implementieren, wird ein roter Standardstift ohne Animation angezeigt.

Zu der Zeit, die didAddAnnotationViews aufgerufen wird, ist die automatische Animation bereits passiert und die Einstellung dieser Eigenschaft hat keine Auswirkungen.

Wenn Sie jedoch eine benutzerdefinierte Animation erstellen möchten, die sich von der Standard-Drop-Animation von MKPinAnnotationView unterscheidet, können Sie dies in didAddAnnotationViews tun. Die Ansicht befindet sich bereits an ihrem endgültigen Zielpunkt, sodass Sie sie speichern und dann von einem anderen Punkt zu diesem Ziel animieren.

Wenn Sie mit der Standard-Drop-Animation zufrieden sind, die MKPinAnnotationView bietet, müssen Sie didAddAnnotationViews nicht implementieren. Diese Delegatmethode ist nützlicher für andere Dinge, die Sie möglicherweise tun müssen, wenn alle Anmerkungssichten tatsächlich vorhanden sind.

Damit Ihre Pins den Titel anzeigen, setzen Sie canShowCallout auf YES, wobei Sie animatesDrop festlegen.

Nicht sicher, was Sie meinen, "dies erstellt eine neue Reihe von MKAnnotationViews". In der ViewForAnnotation-Methode stellen Sie eine Sicht (MKPinAnnotationView) für das MKAnnotation-Objekt bereit. Sie sind nicht dasselbe.

Außerdem funktioniert die viewForAnnotation Methode, wie die cellForRowAtIndexPath Methode für UITableView wo Anmerkung Ansichten recycelt bekommen können, weshalb es wichtig ist, MKAnnotation spezifische Informationen in der Ansicht jedes Mal (wie die Annotation-Eigenschaft) einzustellen.

+0

Vielen Dank aBitObvoius, eine perfekte Antwort. In Bezug auf die MKAnnotationViews wurde ich verwirrt, weil ich dachte, dass wenn man nicht viewForAnnotation implementiert (wo man die roten Standard-Pins bekommt), dass vielleicht schon irgendwo ein MKAnnotationView erstellt wurde und ich es später implementieren müsste ein. – fuzzygoat

+0

OK, indem Sie viewForAnnotation implementieren, überschreiben Sie die Standardansicht, sodass keine Duplizierung erfolgt. – Anna

+0

Verstanden, sehr geschätzt, nochmals vielen Dank für eine sehr hilfreiche Antwort. – fuzzygoat

11

Hier ist die einfachste Lösung, die ich finden konnte. Was es tut, ist ein einzelner Pin auf der UIMapView in ViewDidLoad -Ereignis.

  1. Das Projekt MapKit Rahmen

  2. Die Sicht verweist haben die folgenden Import: #import <MapKit/MapKit.h>

  3. Der View-Controller implementiert MKMapViewDelegate Protokoll

  4. Die View-Controller-Implementierung enthält:

- (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. Die viewDidLoad enthält:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324); 
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil]; 
[mapView addAnnotation:marker]; 
[marker release]; 
+1

In viewForAnnotation: Sie sollten mapView.dequeueReusableAnnotationViewWithIdentifier verwenden, genauso wie Sie dequeueReusableCellWithIdentifier in einer TableView verwenden würden. Andernfalls erstellen Sie weiterhin MKAnnotations mit einer Wiederverwendungskennung, die Sie nicht wirklich wiederverwenden. –

+0

Sie wählen Annotation in viewForAnnotation aus, die ziemlich sinnlos erscheint. – Andy

0

aktualisieren 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 
}