2012-01-18 114 views
0

我只是在尝试学习一些iPhone开发而搞乱。我有一个响应按钮按下的操作功能。我正在尝试生成一堆随机颜色并更改文本颜色以形成一种彩虹动画效果。我错过了强制文本重绘的部分,只显示了最后一个颜色变化。如何从按钮动作事件内更新/重画屏幕

- (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屏幕只有在事件循环触发时每60秒重新绘制一次,而像for循环这样的紧密循环将会阻塞主线程并停止更新事件循环直至完成。

相反,您需要使用定时器或显示链接来执行绘图代码,以便它一次只绘制一帧,并允许事件循环在两者之间进行更新。定时器版本是最容易理解:

- (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/60.0(每秒60帧),以类似的东西1.0/10.0(每秒10帧)。