我只是在努力学习一些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];
}
}
在SO和论坛上的类似问题中,我尝试了类似[self.view reloadInputViews]的内容,但它没有按照我的意思行事。有什么想法吗?
答案 0 :(得分:0)
尝试,[view setNeedsDisplay]
或[view setNeedsDisplayInRect:]
。
答案 1 :(得分: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帧)。