これを行うには多くの方法がありますが....
ブロックアニメーションを使用している場合は、アニメーションの開始時に「isAnimating」フラグを設定し、完了ブロックに再度設定できます。どこからでもブール値をチェックし、必要に応じてケースを処理できます。
アニメーションが発生した後に実行するコードが必要な場合については、
// animation code in some method...
[UIView animateWithDuration:1.0
delay: 0.0
options: UIViewAnimationOptionCurveEaseIn
animations:^{
isAnimating = YES;
fooView.alpha = 0.0;
}
completion:^(BOOL finished){
isAnimating = NO;
[[NSNotificationCenter defaultCenter] postNotificationName:@"FooBeDone" object:nil userInfo:nil]
}];
-(IBAction)buttonPress:(id)sender {
if (isAnimating) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doBar:)
name:@"FooBeDone"
object:nil];
// possibly disable button to prevent multiple taps?
} else {
[self doBar];
}
}
- (void)doBar {
// do what needs to be done when when the animation is over
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"FooBeDone" object:nil];
// possibly enable button again
}
編集:可能な通知方法を示すためにコードを追加しました。IBActionで拡張ループを作成すると、ループが終了してメインの実行ループに戻ることができるまでユーザーインターフェイスがロックされるため、これを回避することを強くお勧めします。通知は同じ効果をもたらすはずですが、メインの実行ループが妨げられることなく続行できるようにします。