2013-05-03 107 views
2

我想在动画完成后执行doSomethingElse。另一个限制是动画代码可以具有不同的持续时间。我怎样才能做到这一点?谢谢!等待动画在iOS中完成?

-(void) doAnimationThenSomethingElse { 
    [self doAnimation]; 
    [self doSomethingElse]; 
} 

例如,这不起作用:

animationDuration = 1; 
[UIView animateWithDuration:animationDuration 
    animations:^{ 
     [self doAnimation]; 
    } completion:^(BOOL finished) { 
     [self doSomethingElse]; 
    } 
]; 
+2

您的问题无法从您提供的内容中解决。请参阅下面的答案,以获得您想要的行为,您必须能够看到执行动画的代码(此处由doAnimation封装)。 – isaac 2013-05-03 22:54:23

回答

6

使用块动画:

[UIView animateWithDuration:animationDuration 
    animations:^{ 
     // Put animation code here 
    } completion:^(BOOL finished) { 
     // Put here the code that you want to execute when the animation finishes 
    } 
]; 
+0

我没有特定的时间,见上面 – 2013-05-03 21:53:23

+0

@ SebastianOberste-Vorth我不明白为什么这会是一个问题。你可以通过任何你想要的时间。 – 2013-05-03 21:53:56

+0

我不知道之前的持续时间,它取决于doAnimation函数,这是随机的 – 2013-05-03 21:55:20

2

您需要能够访问您正在运行的动画的特定实例,以协调每个动画的完成操作。在你的例子中,[self doAnimation]不会让我们看到任何动画,所以你的问题不能用你提供的东西“解决”。

有几种方法可以实现您想要的效果,但这取决于您正在处理的动画类型。

在其他的答案所指出的,在视图上的动画之后执行代码的最常见的方式是通过一个completionBlock中:animateWithDuration:completion:另一种方式来处理属性变化的动画是的范围内设置一个CATransaction完成块交易。

但是,这些特定的方法基本上是为动画属性或层次结构更改视图。当您的动画涉及视图及其属性时,这是推荐的方式,但不包括您可能在iOS中找到的所有类型的动画。从你的问题来看,目前还不清楚你使用的是什么类型的动画(或者如何,或者为什么),但是如果你实际触及CAAnimations(关键帧动画或一组动画)的实例,你会通常做的是建立一个委托:

CAAnimation *animation = [CAAnimation animation]; 
[animation setDelegate:self]; 
[animatedLayer addAnimation:animation forKeyPath:nil]; 

// Then implement the delegate method on your class 
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    // Do post-animation work here. 
} 

的一点是,你如何完成处理实现取决于你的动画是如何实现的。在这种情况下,我们看不到后者,所以我们无法确定前者。

0

从你的意见,我会建议你:

-(void) doAnimation{ 
    [self setAnimationDelegate:self]; 
    [self setAnimationDidStopSelector:@selector(finishAnimation:finished:context:)]; 
    [self doAnimation]; 
} 

- (void)finishAnimation:(NSString *)animationId finished:(BOOL)finished context:(void *)context { 
    [self doSomethingElse]; 
} 
+0

setAnimationDidStopSelector:如果不在UIView动画块中调用,则不执行任何操作。 – isaac 2013-05-03 22:38:30

+0

你是对的,更新了代码 – Efesus 2013-05-03 22:40:56

17

当你不是动画的作者,当动画通过使用交易完成块结束,你可以得到一个回调:

[CATransaction setCompletionBlock:^{ 
    // doSomethingElse 
}]; 
// doSomething