2014-06-23 13 views
5

ja animowanie ramkę mojego MapView z animacją UIView:Wyłącz dodawanie adnotacji do MapView podczas animowania jej ramkę

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

Podczas rozbudowy MapView z powyższym widzę, że MapView jest dodanie zagubionych adnotacje do animacji jest skończony. Po zakończeniu animacji utracone adnotacje znikają.

Połączenia są następujące kiedy rozwinąć mapę:

  1. animateWithDuration rozpocząć
  2. MapView: regionWillChangeAnimated
  3. MapView: didAddAnnotationViews
  4. MapView: regionDidChangeAnimated
  5. animateWithDuration kompletny

Nie ma problemu, gdy minimalizuję mapę prawdopodobnie dlatego, że mapView: didAddAnnotationViews nie jest wywoływany.

Czy mogę w jakiś sposób wyłączyć widoki map regionuWillChange podczas animowania?

Przed animacji:

before

Halfway w animacji. Widzisz wiele nieprawidłowych adnotacji.

middle

Animacja jest wykonywana. Wszystkie niepoprawne adnotacje zniknęły.

after

+0

Czy dodawanie/usuwanie adnotacji w metodach delegata regionWill/DidChangeAnimated? Jeśli tak, spróbuj ustawić flagę boolowską na YES przed rozpoczęciem animacji iw metodach delegatów, nie rób nic, jeśli flaga jest TAK.Ustaw flagę na NIE, gdy animacja zostanie zakończona. – Anna

+0

Nie, testowałem z obnażonym projektem, w którym dodałem adnotacje tylko raz w viewDidLoad, a następnie animowałem mapę w górę iw dół. Więc nie używam żadnej metody delegata do mapView, aby tak się stało. – Toydor

+1

Co powiesz na ukrywanie adnotacji podczas animowania? a następnie wyświetlać adnotacje? – iphonic

Odpowiedz

2

Jako rozwiązanie tymczasowe mogę zaproponować Ci zrobić następujące:
1. Zrób UIImageView z zrzut ekranu MapView przed zmianą to rama
2. Dodaj tę ImageView jako podrzędny do widoku macierzystego i ukryj mapę mapView.
3. animuj oba: imageView i mapView ze zmieniającymi się ramkami.
4. W zakończeniu bloku animacji odkryj mapę i usuń obrazView.

coś takiego:

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

Użyj tego rozwiązanie tymczasowe, aż znajdziesz właściwą drogę, aby rozwiązać ten problem.

1

Próbowałem innego tymczasowego rozwiązania i wygląda na to, że działa całkiem nieźle. Chodzi o ukrywanie wszystkich adnotacji dodawanych przez mapView podczas animacji.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

    ... 

    if (self.isAnimating) { 
     [annotationView hideForDurationOfSeconds:0.25f]; 
    } 

    ... 

} 

W annotationView:

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