2011-08-18 13 views
0

私は回転するボディーのアニメーションを持つiOSアプリケーションで作業しています。一連のUIImagesはNSArrayに格納され、変数は現在のイメージのインデックスを追跡します。UIImageの反復更新は画面に表示されません

次のような方法では、今まで私はタッチイベントへの応答として法と呼ばれている最大UIImageView

- (void)renewImage{ 
    [rotatingBody.image release]; 
    rotatingBody.image = [[UIImage alloc] initWithContentsOfFile:[currentPerson.imageArray objectAtIndex:pictureIndex]]; 
} 

を更新します。 touchイベントから、私は新しいpictureIndexを計算し、[self renewImage]を呼び出します。それは完全に動作します。

しかし、今私はアニメーションに勢いをつけたいと思います。すぐ次の画像を計算する代わりに、私は速度を計算します。速度変数を使用してpictureIndexを更新し、速度を落とし、最終的に[self renewImage]を呼び出すために別のスレッドにループを作成する予定です。私は画面がするまで更新されませんその後、一度行で同じ関数内(ループ内で例えばまたは2回だけ睡眠のいくつかの並べ替えで区切って)[自己renewImage]より呼び出すたび

が問題

をENTER最後の呼び出しの後に。それは、私がrenewImageメソッドが(トレースのおかげで)訪問されたと確信していても、デバイス(またはコンパイラ)が最初の更新を合理化するかのようです。ここで

は動作しませんいくつかのテストコードです:

while (velocity > 0) { 
     pictureIndex++; 
     pictureIndex = pictureIndex % [self getNumberOfImages]; 
     if (pictureIndex < 0) 
     { 
      pictureIndex += [self getNumberOfImages]; 
     } 
     velocity -= 20; 
     NSLog(@"velocity: %f", velocity); 
     [self renewImage]; 
     [NSThread sleepForTimeInterval:0.5]; 
    } 

どちらこれを行います。

pictureIndex += 20; 
[self renewImage]; 
sleep(1); 
pictureIndex += 20; 
[self renewImage]; 

任意の考えを?

答えて

1

イメージを変更するためにNSTimerコールバックを使用します。この方法では、すべてが別のスレッドではなく実行ループ内で発生します。

NSTimerで十分でない場合は、他のスレッドのUI変更が直ちに更新されないため、メインスレッドでメソッドを呼び出してイメージを変更する必要があります。

+0

それは働いた。ありがとうございました!なぜ素早く簡単に説明できますか? (そして、はい、私が知る必要があることはドキュメントに記載する必要があることを知っています) – Jonatan

+1

私が知る限り、UIへの変更はすべてメインスレッド/実行ループ上で実行する必要があります。 –

関連する問題