如何在按钮操作事件中更新/重绘屏幕

时间:2012-01-18 01:23:02

标签: iphone xcode

我只是在努力学习一些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]的内容,但它没有按照我的意思行事。有什么想法吗?

2 个答案:

答案 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帧)。