2010-04-16 4 views
9

J'ai utilisé des images broche dans l'application à la place de la broche standard, maintenant je veux donner de l'animation (effet de chute comme c'était le cas avec les broches standard) aux broches personnalisées. Comment est-ce que je peux fournir l'effet d'animation de baisse aux images faites sur commande de broche ????Animation de broche personnalisée - MKMapView

+0

[Cela devrait aider] (http://stackoverflow.com/questions/1857160/how-can-i-create-a-custom-pin-drop- animation-using-mkannotationview) – dwery

Répondre

24

Implémentez la méthode de délégation suivante.

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    MKAnnotationView *aV; 
    for (aV in views) { 
    CGRect endFrame = aV.frame; 

    aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - 230.0, aV.frame.size.width, aV.frame.size.height); 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.45]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [aV setFrame:endFrame]; 
    [UIView commitAnimations]; 

    } 
} 
+5

Cela a bien fonctionné. Doit être marqué réponse correcte. –

6

Il sent aussi beaucoup plus frais si vous ne laissez pas tomber toutes les broches à la fois, mais laissez tomber chacun d'eux avec un petit retard pour qu'il regardera comme il y a une pluie d'effet broches. Semblable à ce que Apple fait nativement. Utilisez ceci:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    MKAnnotationView *aV; 

    float delay = 0.00; 

    for (aV in views) { 
     CGRect endFrame = aV.frame; 

     aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - 430.0, aV.frame.size.width, aV.frame.size.height); 
     delay = delay + 0.01; 

     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDelay:delay]; 
     [UIView setAnimationDuration:0.45]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
     [aV setFrame:endFrame]; 
     [UIView commitAnimations]; 
    } 
} 
+0

Oui, c'est cool! Merci – PrasadW

0

Cela a bien fonctionné pour moi. Rappelez-vous où je ne peux pas trouvé ici si

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
MKAnnotationView *aV; 

for (aV in views) { 

    // Don't pin drop if annotation is user location 
    if ([aV.annotation isKindOfClass:[MKUserLocation class]]) { 
     continue; 
    } 

    // Check if current annotation is inside visible map rect, else go to next one 
    MKMapPoint point = MKMapPointForCoordinate(aV.annotation.coordinate); 
    if (!MKMapRectContainsPoint(self.mapView.visibleMapRect, point)) { 
     continue; 
    } 

    CGRect endFrame = aV.frame; 

    // Move annotation out of view 
    aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - self.view.frame.size.height, aV.frame.size.width, aV.frame.size.height); 

    // Animate drop 
    [UIView animateWithDuration:0.3 delay:0.03*[views indexOfObject:aV] options:UIViewAnimationCurveLinear animations:^{ 

     aV.frame = endFrame; 

     // Animate squash 
    }completion:^(BOOL finished){ 
     if (finished) { 
      [UIView animateWithDuration:0.05 animations:^{ 
       aV.transform = CGAffineTransformMakeScale(1.0, 0.8); 

      }completion:^(BOOL finished){ 
       if (finished) { 
        [UIView animateWithDuration:0.5 animations:^{ 
         aV.transform = CGAffineTransformIdentity; 
        }]; 
       } 
      }]; 
     } 
    }]; 
    } 
} 
0

Notez que l'animation de la vue d'annotation dans -mapView:didAddAnnotationViews: provoque des effets étranges lorsque MKMapView.userTrackingMode est égal à MKUserTrackingModeFollowWithHeading. Je souhaite juste qu'Apple a rendu l'animation disponible à la classe MKAnnotationView.

0

Swift 3 animation goutte

// animate annotation views drop 
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) { 
     for annView in views { 

      // animate any annotation views except the user pin 
      if !(annView.annotation?.isKind(of: MKUserLocation.self))! { 
       let endFrame = annView.frame 
       annView.frame = endFrame.offsetBy(dx: 0, dy: -500) 
       UIView.animate(withDuration: 0.5, animations: { 
        annView.frame = endFrame 
       }) 
      } 
     } 
Questions connexes