2010-10-05 4 views
0

J'ai réussi à assembler une mapview avec une annotation de broche représentant la position actuelle de l'utilisateur qui se met à jour à un intervalle donné. Lorsque le gestionnaire de position met à jour la position de l'utilisateur, l'annotation des broches disparaît et réapparaît au nouvel emplacement. Quelqu'un at-il joué avec la mise à jour de l'emplacement GPS de l'utilisateur actuel à l'aide d'une animation, comme ce qui se fait dans l'application de cartographie officielle d'Apple? Si c'est le cas, j'aimerais avoir quelques conseils pour que cela fonctionne. Merci!iphone sdk Emplacement des utilisateurs de la mise à jour de MapView

Répondre

0

Solution 1:

Tout d'abord, vous devez faire de votre contrôleur de vue de mettre en œuvre MKMapViewDelegate si elle n'a pas déjà.

Ensuite, mettre en œuvre cette méthode:

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

    } 
} 

Ajoutez vos annotations au MapView et quand ils sont ajoutés, cette méthode de délégués sera appelé et animerez les broches de haut en bas comme ils sont ajoutés.

Les valeurs de timing et de positionnement peuvent être légèrement modifiées, mais je l'ai ajustée pour qu'elle soit la meilleure/la plus proche de la goutte traditionnelle (pour autant que j'ai testé).

Solution 2:

Sinon, si vous faites une sous-classe MKAnnotationView, vous pouvez utiliser didMoveToSuperview pour déclencher l'animation. Ce qui suit fait une chute qui se termine par un léger effet «squish»

#define kDropCompressAmount 0.1 

    @implementation MyAnnotationViewSubclass 

    ... 

    - (void)didMoveToSuperview { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
     animation.duration = 0.4; 
     animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 
     animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0, -400, 0)]; 
     animation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 

     CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath:@"transform"]; 
     animation2.duration = 0.10; 
     animation2.beginTime = animation.duration; 
     animation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
     animation2.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(0, self.layer.frame.size.height*kDropCompressAmount, 0), 1.0, 1.0-kDropCompressAmount, 1.0)]; 
     animation2.fillMode = kCAFillModeForwards; 

     CABasicAnimation *animation3 = [CABasicAnimation animationWithKeyPath:@"transform"]; 
     animation3.duration = 0.15; 
     animation3.beginTime = animation.duration+animation2.duration; 
     animation3.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
     animation3.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
     animation3.fillMode = kCAFillModeForwards; 

     CAAnimationGroup *group = [CAAnimationGroup animation]; 
     group.animations = [NSArray arrayWithObjects:animation, animation2, animation3, nil]; 
     group.duration = animation.duration+animation2.duration+animation3.duration; 
     group.fillMode = kCAFillModeForwards; 

     [self.layer addAnimation:group forKey:nil]; 
    } 

Espérons que cela aide!

PK

Questions connexes