Анимация удаления аннотаций - PullRequest
13 голосов
/ 19 декабря 2011

У меня есть карта и набор аннотаций, каждая со свойством «родителя».В настоящее время, когда я добавляю аннотации, я реализую метод didAddAnnotationViews, чтобы анимировать эти аннотации, чтобы они выглядели как координаты их родителя.Есть ли способ сделать это во время удаления аннотаций?Когда я удаляю аннотацию с карты, я хочу, чтобы она анимировалась в своей родительской координате, и, насколько я знаю, для didAddAnnotationViews нет эквивалента для случая, когда аннотация удаляется.

Ответы [ 2 ]

16 голосов
/ 19 декабря 2011

Анимированная аннотация до Вы удаляете ее с карты и выполняете удаление после завершения анимации. Код может выглядеть так:

- (void) removeMyAnnotation:(MyAnnotation*)annotation{
   [UIView animateWithDuration:1.0f
                    animations:^(void){
                         annotation.coordinate = annotation.parentAnnotation.coordinate;
                    }
                    completion:^(BOOL finished)completion{
                        [mapView removeAnnotation:annotation];
                    }
}
5 голосов
/ 15 февраля 2015

Вы должны НЕ отложить вызов removeAnnotation , как в ответе @ Vladimir, потому что состояние MKMapView может быть изменено во время анимации.

К тому времени, когда removeAnnotation вызывается из блока завершения анимации, другие аннотации могут быть добавлены / удалены из MapView, поэтому в некоторых случаях вы можете удалить неправильный набор аннотаций.

Я написал эту категорию для MKMapViewВы можете использовать для удаления анимированных аннотаций безопасным способом:

@interface MKMapView (RemoveAnnotationWithAnimation)

- (void)removeAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
- (void)removeAnnotations:(NSArray *)annotations animated:(BOOL)animated;

@end

И файл .m:

@implementation MKMapView (RemoveAnnotationWithAnimation)

- (void)removeAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated
{
    [self removeAnnotations:@[annotation] animated:animated];
}

- (void)removeAnnotations:(NSArray *)annotations animated:(BOOL)animated
{
    if (animated) {
        NSSet * visibleAnnotations = [self annotationsInMapRect:self.visibleMapRect];
        NSMutableArray * annotationsToRemoveWithAnimation = [NSMutableArray array];
        for (id<MKAnnotation> annotation in annotations) {
            if ([visibleAnnotations containsObject:annotation]) {
                [annotationsToRemoveWithAnimation addObject:annotation];
            }
        }
        NSMutableArray * snapshotViews = [NSMutableArray array];
        for (id<MKAnnotation> annotation in annotationsToRemoveWithAnimation) {
            UIView * annotationView = [self viewForAnnotation:annotation];
            if (annotationView) {
                UIView * snapshotView = [annotationView snapshotViewAfterScreenUpdates:NO];
                snapshotView.frame = annotationView.frame;
                [snapshotViews addObject:snapshotView];
                [[annotationView superview] insertSubview:snapshotView aboveSubview:annotationView];
            }
        }
        [UIView animateWithDuration:0.5
                         animations:^{
                             for (UIView * snapshotView in snapshotViews) {
                                 // Change the way views are animated if you want
                                 CGRect frame = snapshotView.frame;
                                 frame.origin.y = -frame.size.height;
                                 snapshotView.frame = frame;
                             }
                         }
                         completion:^(BOOL finished) {
                             for (UIView * snapshotView in snapshotViews) {
                                 [snapshotView removeFromSuperview];
                             }
                         }];
    }
    [self removeAnnotations:annotations];
}

@end
...