Большинство ответов основаны на том факте, что ваша аннотация была сделана через расширение MKPlacemark. Но как насчет любого другого объекта (то есть пользовательского изображения для маркера), который реализует только протокол MKAnnotation? Не было бы метода setCoordinate. Итак, вот ответ на основе кода, предоставленного 100грамм
MKAnnotationView *av = [self.mapView viewForAnnotation:user];
//user is an object which implements <MKAnnotation>
// You will probably get your MKAnnotationView in your own way
if (av){
// here user returns CLLocationCoordinate2D coordinate
MKMapPoint mapPoint = MKMapPointForCoordinate([user getLastLocation]);
// converting mapPoint to CGPoint
CGPoint newPos;
CGFloat zoomFactor = self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
newPos.x = mapPoint.x/zoomFactor;
newPos.y = mapPoint.y/zoomFactor;
// animation for annotation's move
static NSString *POSITION_KEY=@"positionAnimation";
static NSString *PATH_ANIMATION_KEY=@"position";
if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:PATH_ANIMATION_KEY];
animation.fromValue = [NSValue valueWithCGPoint:av.center];
animation.toValue = [NSValue valueWithCGPoint:newPos];
animation.duration = 0.3;
animation.delegate = av;
animation.fillMode = kCAFillModeForwards;
[av.layer addAnimation:animation forKey:POSITION_KEY];
}
// moving view
av.center = newPos;
Таким образом, вам в основном нужно получить соответствующий MKAnnotationView, который также может быть достигнут путем итерации по всем аннотациям и его новому местоположению. Я сделал держатель массива для всего этого (NSMutableArray * mapAnnotaions), чтобы теперь я мог выполнять итерации так же, как:
for (id annotation in mapAnnotaions) {call refresh method here for id}