У меня есть карта и набор аннотаций, каждый из которых имеет свойство "parent". В настоящее время, когда я добавляю аннотации, я реализую метод didAddAnnotationViews для анимации этих аннотаций, чтобы они, по-видимому, исходили из их родительской координаты. Есть ли способ сделать это во время удаления аннотаций? Когда я удаляю аннотацию с карты, я хочу, чтобы она анимировалась в ее родительской координате, и насколько я знаю, для didAddAnnotationViews нет эквивалента для того, когда аннотация удаляется.
Анимация удаления аннотаций
Ответ 1
Анимация аннотации до вы удаляете ее с карты и выполняете удаление после завершения анимации. Код может выглядеть так:
- (void) removeMyAnnotation:(MyAnnotation*)annotation{
[UIView animateWithDuration:1.0f
animations:^(void){
annotation.coordinate = annotation.parentAnnotation.coordinate;
}
completion:^(BOOL finished)completion{
[mapView removeAnnotation:annotation];
}
}
Ответ 2
Вы должны НЕ отложить вызов removeAnnotation, как в ответе @Vladimir, потому что состояние MKMapView может быть изменено во время анимации.
К моменту, когда removeAnnotation вызывается из блока завершения анимации, в MapView могут быть добавлены/удалены другие аннотации, поэтому в некоторых случаях вы можете удалить неправильный набор аннотаций. p >
Я написал эту категорию для 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