質問: [NSString stringWithFormat:@"¥%d",count]; } } ```
回答: 参考サイトとサンプルコードを拝見させていただきました。 まず、参考サイトでは一度のみの実行しか考慮しておらず、プログラムによる繰り返しを考慮したコードになっていません。 その前提でサンプルコードを見てみるとfor文で一気にアニメーションを登録しているため、同時に100個分のアニメーションが登録されてしまっています。 結果的に一番最後に登録したアニメーションのみ実行されてしまっています。 そのため、何らかの方法で**1つ前のアニメーションが終了してから次のアニメーションを登録する**ように実装する必要があります。 以下はサンプルコードを極力引き継いだ形での例です。 ``` int _count = 0; //ラベルに表示する数字用の変数 int _maxCount = 100; //カウントアップする上限値 - (void)viewDidLoad { [super viewDidLoad]; UILabel *label = [[UILabel alloc] init]; label.frame = CGRectMake(100, 190, 100, 50); label.backgroundColor = [UIColor yellowColor]; label.textColor = [UIColor blackColor]; label.font = [UIFont fontWithName:@"AppleGothic" size:22]; label.text = [NSString stringWithFormat:@"¥%d",_count]; [self.view addSubview:label]; label.tag = 100; //別メソッドで取り出すためのタグを設定 [self addTransitionToLabel:label withCount:_count]; //アニメーションの追加 } /* * CAAnimation(CATransitionの親クラス)のデリゲートメソッド * デリゲート先にこのクラスを指定したアニメーションが終了した際に呼び出される。 */ - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { UILabel *label = (UILabel*)[self.view viewWithTag:100]; //タグを指定して対象のラベルを取得 //停止を検知したアニメーションがlabel.layerに追加したものかどうか判定する //(CATransitionは自動的にtransitionがキーとして割り当てられるため、 // transitionをキーにしてlabel.layerからアニメーションを取り出す) if (anim==[label.layer animationForKey:@"transition"]) { //label.layerから前回のアニメーションを削除する [label.layer removeAnimationForKey:@"transition"]; _count++; //ここでカウントをインクリメント if (_count>_maxCount) { //_maxCountまでアニメーションが終わったら次のアニメーションを追加せずメソッドを終える return; } //次回のアニメーションを登録する [self addTransitionToLabel:label withCount:_count]; } } /* * アニメーション登録部分を別メソッド化 */ - (void)addTransitionToLabel:(UILabel*)label withCount:(int)count { CATransition *Anim = [CATransition animation]; [Anim setType:kCATransitionMoveIn]; [Anim setSubtype:kCATransitionFromBottom]; [Anim setDuration:0.2f]; [Anim setDelegate:self]; //CAAnimationのデリゲート先としてself(このクラス)を指定 [Anim setRemovedOnCompletion:NO]; //animationDidStopで判定するため自動削除させないようにする [label.layer addAnimation:Anim forKey:nil]; label.text = [NSString stringWithFormat:@"¥%d",count]; } ``` この例では画面表示直後にアニメーションが実行されますが、`addTransitionToLabel:withCount:`を実行することで任意のタイミングで再度実行可能です。 *例示するためのコードなので、やるべきでない書き方をしている部分がいくつかあります。実際に利用される場合は適宜書き換えてください。*