18048


超初心者です。すみません。

複数のimageViewのアニメーションを順番に一つずつ動くようにしたいです。  
現時点では指定した数のimageViewは落ちてきますが、すべて同時に落ちてきます。  
@"アニメーション終了"のログも同時に出ます。

imageViewをfor文の中で配列に入れる必要があるのでしょうか。  
よろしくお願いいたします。

[code]

    -(IBAction)buttonPushed{
    
    for(i = 0;i < repeatCount;i++){
        image = [UIImage imageNamed:@"img.png"];
        imageView = [[UIImageView alloc]initWithImage:image];
    
        imageView.frame = CGRectMake(15+i*40, -150, 85, 150);
        [self.view addSubview:imageView];
    
    
        // アニメーション    
        [UIView animateWithDuration:0.5f 
                              delay:0.1f
                            options:UIViewAnimationOptionCurveEaseInOut
                         animations:^{
                             imageView.transform = CGAffineTransformMakeTranslation(0, 550);
    
                         } completion:^(BOOL finished) {
                             NSLog(@"アニメーション終了");
    
                         }];
    
            usleep(500000);
    
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-25T02:41:26.637
18040
2015-10-25T06:49:47.150
12952
question
ios objective-c
アニメーションを順番にしたい


iOSとiPhone/iPadは、マルチスレッドで動いています。アニメーションが（見た目）同時に動いてしまうというのは、for文のくり返し処理と、UIViewのアニメーションが、別スレッドで処理されていると、判断できるでしょう。`repeatCount`がどのくらいの大きさかわかりませんが、`10000`であっても、0.1秒かからないでしょう。

一定間隔で、アニメーションを開始するなら……`NSTimer`クラスを利用する。マルチスレッドを直接触る（`NSThread`クラス、GCD（Grand
Central Dispach)など）ということも考えられますが、それなりの勉強が必要です。

[code]

    usleep(500000);
    
[/code]

これはなんでしょうか？「超初心者」の人が安心して使える関数なんでしょうか？いずれ、無視されてることは確実ですけど。

* * *

サンプルコードを載せておきます。  
NSTimerを使った処理。

[code]

    - (IBAction)startAnimation:(id)sender { // ボタンを押して開始。
        // タイマーを作って、開始。repeatsをYESにして、無限ループにする。
        [NSTimer scheduledTimerWithTimeInterval: 1.0 target: self selector: @selector(moveImage:) userInfo: nil repeats: YES];
    }
    
    - (void)moveImage: (NSTimer *)timer { // NSTimerが呼ぶセレクタ。
        // staticオプションをつけて、メソッド内で有効な変数とする。
        static int count = 0; // 繰り返しのカウンタ。
        static CGPoint imageCenter = {70.0, 70.0}; // imageViewの位置。
        if (count > 4) {
            count = 0;
            imageCenter = CGPointMake(70.0, 70.0);
            [timer invalidate]; // 5回繰り返したらタイマー停止。
            return;
        }
    
        UIImageView *imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"image.png"]];
        imageView.center = imageCenter;
        [self.view addSubview: imageView];
        [UIView animateWithDuration: 3.0 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut animations: ^ {
            imageView.center = CGPointMake(imageCenter.x, imageCenter.y + 200.0);
        } completion: NULL];
        count++; // カウンタ追加。
        imageCenter.x += 20.0; // imageViewの位置を右にずらす。
    }
    
[/code]


CC BY-SA 3.0
2015-10-25T03:55:03.027
18044
2015-10-25T06:49:47.150
2015-10-25T06:49:47.150
7362
7362
18040
answer


`delay:`を使うのが楽だと思います。

[code]

    // アニメーション
    [UIView animateWithDuration:0.5f
                          delay:0.1f + 0.5f * i
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         imageView.transform = CGAffineTransformMakeTranslation(0, 550);
    
                     } completion:^(BOOL finished) {
                         NSLog(@"アニメーション終了");
    
                     }];
    
    //usleep(500000); 消しても良い
    
[/code]


CC BY-SA 3.0
2015-10-25T06:21:36.037
18048
2015-10-25T06:21:36.037
5337
18040
answer