Inhabilitar agregar annotations a mapView mientras anima su marco

Estoy animando el marco de mi mapView con una animation UIView:

[UIView animateWithDuration:0.25f animations:^{ self.mapView.frame = frame; } completion:nil]; } 

Al expandir el mapView con lo anterior, veo que mapView agrega annotations fuera de lugar hasta que la animation termine. Cuando la animation finaliza, las annotations desplazadas desaparecen.

Las llamadas son las siguientes cuando expande el map:

  1. AnimateWithDuration begin
  2. mapView: regionWillChangeAnimated
  3. mapView: didAddAnnotationViews
  4. mapView: regionDidChangeAnimated
  5. animatewithduration complete

No hay problema cuando minimizo el map probablemente porque mapView: didAddAnnotationViews no se llama.

¿Puedo de alguna manera inhabilitar mapviews regionWillChange mientras animo?

Antes de la animation:

antes de

A mitad de path en la animation. Ver muchas annotations erróneas.

medio

La animation está hecha. Todas las annotations perdidas se han ido.

después

Como solución temporal, puedo sugerirle que haga lo siguiente:
1. Cree una UIImageView con screenShot de su mapView antes de cambiar su marco.
2. Agregue esa imageView como subView a su vista principal y oculte su mapView.
3. anima ambos: imageView y mapView con cambiar sus cuadros.
4. En el bloque de finalización de la animation, muestre su mapView y elimine imageView.

Algo como esto:

 - (UIImage *)imageFromView:(UIView *) view { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]); } else { UIGraphicsBeginImageContext(view.frame.size); } [view.layer renderInContext: UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (void)foo { UIImageView *mapScreenShotView = [[UIImageView alloc] initWithImage:[self imageFromView:self.mapView]]; mapScreenShotView.frame = self.mapView.frame; [self.mapView.superview addSubview:mapScreenShotView]; self.mapView.hidden = YES; CGRect frame = self.mapView.frame; frame.origin = ... frame.size = ... // here no more need to animate mapView, because currently its hidden. So we will change it's frame in outside of animation block. self.mapView.frame = frame; [UIView animateWithDuration:0.25f animations:^{ mapScreenShotView.frame = frame; } completion:^{ self.mapView.hidden = NO; [mapScreenShotView removeFromSuperview]; }]; } 

Utilice esta solución temporal hasta que encuentre una forma correcta de resolver ese problema.

Intenté otra solución temporal y parece funcionar bastante bien. Se trata de ocultar todas las annotations que mapView está agregando durante la animation.

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { ... if (self.isAnimating) { [annotationView hideForDurationOfSeconds:0.25f]; } ... } 

En annotationView:

 - (void)hideForDurationOfSeconds:(NSTimeInterval)duration { self.hidden = YES; [self performSelector:@selector(setHidden:) withObject:NO afterDelay:duration]; }