Почему UIView: animateWithDuration завершается немедленно? - PullRequest
2 голосов
/ 03 мая 2011

У меня есть подкласс MKPointAnnotation со следующим методом, который я запускаю на iOS 4:

- (void)animate {
    [UIView
     animateWithDuration: 3.0
     delay:1.0
     options:UIViewAnimationOptionAllowUserInteraction
     animations:^{
         CLLocationCoordinate2D loc = 
             CLLocationCoordinate2DMake([self coordinate].latitude + 0.001,
                                        [self coordinate].longitude + 0.001);
         [self setCoordinate:loc];

     }
     completion:^(BOOL finished) {
         NSLog(@"Is completed");
     }];
}

Вызывается нажатием UIBarButtonItem.

Я ожидаю увидеть мое путешествие по аннотации через MKMapView. Однако все, что я вижу, - это аннотация в месте последнего упокоения, когда я вызываю метод следующим образом:

[mapView addAnnotation:myAnnotation];
[myAnnotation animate];
[myAnnotation release];

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

[mapView addAnnotation:myAnnotation];
[myAnnotation performSelector:@selector(animate) withObject:nil afterDelay:0.5];
[myAnnotation release];

Обратите внимание, что я получаю непреднамеренное поведение, если значение 'afterDelay' меньше, например <0,1 с. </p>

Есть идеи, почему это может иметь место?

1 Ответ

1 голос
/ 28 июня 2011

Анимация в конечном итоге действует на MKAnnotationView, а не MKAnnotation.Добавление аннотации к MKMapView не обязательно означает, что соответствующее представление будет добавлено в ближайшее время.

Поэтому вы получаете сумасшедшее поведение, если пытаетесь анимировать MKAnnotation до того, как была добавлена ​​соответствующая MKAnnotationViewк MKMapView.

Решение состоит в том, чтобы анимировать MKAnnotation только после того, как вы знаете, что соответствующий MKAnnotationView добавлен в MKView.Вы можете узнать это, используя MKMapViewDelegate - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views для запуска анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...