为什么UIView:animateWithDuration立即完成?

时间:2011-05-03 13:10:56

标签: objective-c ios core-animation

我有一个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.1S。

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:1)

动画最终会作用于MKAnnotationView,而非MKAnnotation。向MKMapView添加注释并不一定意味着将很快添加相应的视图。

因此,如果您在将相应的MKAnnotationView添加到MKMapView之前尝试为MKAnnotation设置动画,则会出现疯狂的行为。

解决方案是只有在知道MKAnnotation已添加到MKView后才动画MKAnnotation。您可以使用MKMapViewDelegate - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views来触发动画,从而了解这一点。