iPhone SDK - 我如何知道动画何时结束?

5
当触摸图像时,我会开始一个动画放大效果,然后在释放时将其缩小回正常大小。使用 setAnimationBeginsFromCurrentState:YES 可以使缩放效果非常流畅,即使在动画进行过程中你提前松开手指。
然而,我的需求是:如果你触摸图像的时间足够长,使得动画完成后“锁定”更大的尺寸,但如果你提前释放,则让它像平常一样缩小回去。
是否有一种方法可以判断当前是否正在运行动画,或者某个特定的动画是否已经完成?
我认为可以在 touchesStarted 中使用 performSelector:afterDelay: 调用来实现这一点,延迟时间等于动画的长度,并在 touchesEnded 来得及之前取消它,但我不认为这是最好的方法...?
3个回答

13
- (void)animateStuff {
    [UIView beginAnimations:@"animationName" context:nil];
    [UIView setAnimationDelegate:self];
    [self.view doWhatever];
    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)animationID
                finished:(NSNumber *)finished
                 context:(void *)context
{
    if ([finished boolValue]) {
        NSLog(@"Animation Done!");
    }
}

1
我花了一些时间才意识到这实际上就是我想要的。 animationDidStop 会在缩放达到目标位置或收缩动画接管时被调用。然而,finished 的值告诉我们它是否按照最初的指令完成。我可以建议您将示例中的 animationDidStop 函数体更改为: if ([finished boolValue]) { NSLog(@"Animation Finished!"); }这样就是完美的答案 :) - Chris Newman

1

另一种可能性:

 [UIView animateWithDuration:0.3 animations:^{      myView.transform = CGAffineTransformMakeRotation(M_PI); }completion:^(BOOL finished) {      NSLog(@"Animation complete!"); }];

0
我认为"+(void) setAnimationDidStopSelector:(SEL) selector"应该符合你的要求。它会在动画完成后调用您的代理上指定的选择器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接