5

私は単純なサイモン ゲームを作成しようとしています (色が点滅するシーケンスが増加し、ユーザーはそのシーケンスを繰り返さなければなりません)。私が行っている方法は、8 つの画像を持つ 4 つの UIView を持つことです。したがって、赤、青、緑、および黄色の UIView があります。そして、濃い緑、薄緑、濃い赤、薄い赤などのGIFがあります。

したがって、私のコードでは、UIView の transitionWithView アニメーション ブロックを使用しています。UIView imageView.image はデフォルトで暗い色の画像に設定されており、このブロックは明るい色の画像に移行し、完了すると暗い色の画像に戻ります ( 「ライトアップ」の外観)。

- (void) animateColor:(NSString *)color
{
    ...
    //do stuff to default the dark and light image name and which UIView to animate based on the color parameter
    ...
    [UIView transitionWithView:imageView
                  duration:.5
                   options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAutoreverse
                animations:^{
                    imageView.image = [UIImage imageNamed:lightImage];
                } 
                completion:^(BOOL finished){
                    if (finished){
                        imageView.image = [UIImage imageNamed:darkImage];
                    }
                }];
}

これは、このコードのメソッドを 1 つの色で呼び出すとうまく機能します。

問題は、順番にアニメーション化したい NSArray または色があるとします。したがって、配列が「青」、「緑」の場合、青を使用して transitionWithView を呼び出し、青のビューをアニメーション化してから、緑のビューをアニメーション化します。現在、緑色のビューと青色のビューが同時にアニメーション化されます。

私は今NSTimerをいじろうとしていますが、うまくいきません。

アドバイスをいただければ幸いです。

4

2 に答える 2

5

複数のトランジションを連続して実行しようとすると、同様の問題が発生しました。完了ブロック内に状態変数を設定するだけで解決しました。次に、この状態変数は、次の遷移の条件を有効にします。さて、私は runloop メソッドでタイマーを使用しているので、ここでの作業は簡単でした:

- (void) runloop {

    static int step = 1;

    if (step == 1)
    {
        step = 0;
        [UIView transitionWithView:imageView
                          duration:1
                           options:UIViewAnimationOptionTransitionCrossDissolve
                        animations:^{ imageView.image = [UIImage imageNamed:lightImage]; }
                        completion:^(BOOL finished){ step = 2; }];
    }

    if (step == 2)
    {
        step = 0;
        [UIView transitionWithView:imageView
                          duration:1
                           options:UIViewAnimationOptionTransitionCrossDissolve
                        animations:^{ imageView.image = [UIImage imageNamed:darkImage]; }
                        completion:^(BOOL finished){ step = 0; }];
    }
}

このようにして、ネストされたブロックに迷うことなく、何十ものトランジションを行うことができます。

于 2012-10-08T20:02:07.730 に答える
3

OK、いくつか/たくさん遊んだ後、解決策を見つけました。まず、transitionWithView を次のように変更しました。

[UIView transitionWithView:imageView
                  duration:1
                   options: UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                    imageView.image = [UIImage imageNamed:lightImage];
                } 
                completion:^(BOOL finished){
                    if (finished){
                        [UIView transitionWithView:imageView
                                          duration:1
                                           options:UIViewAnimationOptionTransitionCrossDissolve
                                        animations:^{
                                            imageView.image = [UIImage imageNamed:darkImage];
                                        }
                                        completion:^(BOOL done){
                                            if (done){
                                                // Do some program upkeep logic 
                                            }
                                        }
                         ];
                    }
                }
 ];

上記の大きな変更は、私が持っていた元の UIViewAnimationOptionAutoreverse を削除し、完了ブロックで明るい画像から暗い画像に移動するアニメーションを追加することでした。

次に、上記のメソッド (animateColor:) を呼び出すために、配列をループし、afterDelay を増やして実行セレクターを使用します。

    for (NSString *color in self.randomPattern.patternArray) {
        [self performSelector:@selector(animateColor:) withObject:color afterDelay:1.5*self.counter];
        ++self.counter;
    }
于 2012-07-09T02:09:17.963 に答える