

Xcodeで、数字が増える度に更新された数が上下に動くアニメーションを作っています。

<http://qiita.com/noppefoxwolf/items/32530bb5f011ac2c9c91>

こちらのサイトを参考に作りましたが、  
for文で0から100の数字を順にカウントすると、最初の0の次がfor文の最後の100になってしまい、  
アニメーションが0→100の一回しか行われません。

ログとブレークポイントで確認すると、カウントはしっかり0から100まで1ずつ増加していて、  
ループが終わった後に数字が更新されてアニメーションしています。

100回ループさせて順に数えたいのですが、どうしたら良いでしょうか？  
よろしくお願いいたします。

[code]

    -(void) viewDidLoad{
        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];
        [myView addSubview:label];
    
       for(count = 0;count < 100;count++){
    
            Anim = [CATransition animation];
            [Anim setType:kCATransitionMoveIn];
            [Anim setSubtype:kCATransitionFromBottom];
            [Anim setDuration:0.2f];
            [coinlabel.layer addAnimation:Anim forKey:nil];
            label.text = [NSString stringWithFormat:@"¥%d",count];
        }
    }
    
[/code]


CC BY-SA 3.0
2015-11-13T07:10:10.840
18785
2015-11-16T09:06:18.437
12886
question
ios objective-c xcode
Xcodeでアニメーションを連続して実行できません


参考サイトとサンプルコードを拝見させていただきました。

まず、参考サイトでは一度のみの実行しか考慮しておらず、プログラムによる繰り返しを考慮したコードになっていません。

その前提でサンプルコードを見てみるとfor文で一気にアニメーションを登録しているため、同時に100個分のアニメーションが登録されてしまっています。  
結果的に一番最後に登録したアニメーションのみ実行されてしまっています。

そのため、何らかの方法で **１つ前のアニメーションが終了してから次のアニメーションを登録する** ように実装する必要があります。

以下はサンプルコードを極力引き継いだ形での例です。

[code]

    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];
    }
    
[/code]

この例では画面表示直後にアニメーションが実行されますが、`addTransitionToLabel:withCount:`を実行することで任意のタイミングで再度実行可能です。

_例示するためのコードなので、やるべきでない書き方をしている部分がいくつかあります。実際に利用される場合は適宜書き換えてください。_


CC BY-SA 3.0
2015-11-16T09:06:18.437
18891
2015-11-16T09:06:18.437
3227
18785
answer