2012-01-18 25 views
0

私はいくつかのiPhone開発を学びたいと思っています。私はボタン・プレスに応答するアクション機能を持っています。私はランダムな色の束を生成し、虹のアニメーション効果の一種を作るためにテキストの色を変更しようとしています。私は、テキストを強制的に再描画する部分を欠いています。最後の色の変更が表示されます。同様のSOの質問やフォーラムからボタンアクションイベント内から画面を更新/再描画する方法

- (IBAction)clearGreeting:(id)sender 
{ 
    for (int i = 0; i < 100; ++i) 
    { 

     // Generate random color 
     float red = 0; 
     float green = 0; 
     float blue = 0; 
     float alpha = 0; 

     red = (float)rand()/RAND_MAX; 
     green = (float)rand()/RAND_MAX; 
     blue = (float)rand()/RAND_MAX; 
     alpha = (float)rand()/RAND_MAX; 

     self.label.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
     // need something here to update the display 
     [NSThread sleepForTimeInterval:0.05]; 
    } 
} 

は、私は[self.view reloadInputViews]のようなものをしようとしますが、私が何を意味するかやっていません。何か案は?

答えて

0

Try、[view setNeedsDisplay]または[view setNeedsDisplayInRect:]

0

iPhoneの画面は、イベントループが発生し、forループのようなタイトなループがメインスレッドをブロックするだけで60秒に1度再描画されるため、アニメーションを行うことはできません終了するまでイベントループの更新を停止します。

代わりに、タイマーまたは表示リンクを使用して描画コードを実行する必要があります。これにより、一度に1つのフレームだけが描画され、その間にイベントループが更新されます。タイマーのバージョンは、最も簡単に理解することです:

- (IBAction)clearGreeting:(id)sender 
{ 
    [NSTimer scheduledTimerWithTimeInterval:1.0/60.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
} 

- (void)update 
{ 
    // Generate random color 
    float red = 0; 
    float green = 0; 
    float blue = 0; 
    float alpha = 0; 

    red = (float)rand()/RAND_MAX; 
    green = (float)rand()/RAND_MAX; 
    blue = (float)rand()/RAND_MAX; 
    alpha = (float)rand()/RAND_MAX; 

    self.label.textColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
} 

は1.0/10.0(毎秒10のフレーム)のようなものに1.0/60.0(毎秒60フレーム)を変更、アニメーションが遅くなるようにするには。

関連する問題