9
votes

Animation sur mesure - MKMAPView

J'ai utilisé des images PIN dans l'application au lieu de la broche standard, je souhaite maintenant donner une animation (effet de chute car il s'agissait de broches standard) aux broches personnalisées. Comment puis-je fournir un effet d'animation supprimant les images PIN personnalisées ????


1 commentaires

5 Réponses :


24
votes

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

   }
}


0 commentaires

6
votes

Il se sent aussi plus frais si vous ne laissez pas laisser tomber toutes les broches à la fois, mais déposez chacune d'elles avec un petit retard afin de ressembler à une pluie d'effets de pins. 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 commentaires

0
votes

Cela a bien fonctionné pour moi. Ne me souviens pas d'où je l'ai trouvé ici bien que

- (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 commentaires

0
votes

Notez que l'animation de la vue Annotation dans -MapView: DIDADDAnnotationViews: Cause Effets étranges Lorsque MKMAPVIEW.USERTRACKINDMODE EQUALLES MKUSERTRACKINGMODOWIPOWHIPE Je souhaite juste que Apple a fait l'animation DROP disponible pour la catégorie mkannotationview .


0 commentaires

0
votes

Swift 3 forte> Animation DROP

// 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
                })
            }
        }


0 commentaires