ViewController在睡眠前不会更新

时间:2012-02-17 18:44:11

标签: iphone xcode uiviewcontroller sleep

我写了以下代码:

代码:

[MyImage setHighlighted:true];
Sleep(1);
[MyImage setHighlighted:false];

我需要突出显示我的图像一秒钟,然后再将其取回,但是X-Code到达[MyImage setHighlighted:true]时没有任何事情(我知道它会这样做)并且之后睡眠执行并且主要应用程序的线程进入休眠状态1秒钟,然后执行最后一行,但我的问题是为什么第一行不更新UI,我可以看到用户界面中的任何内容。

在第一行代码中,Sleep方法没有执行,主线程处于正常状态,它应该将我的图像设置为高亮显示,之后进入休眠状态1秒钟,然后将图像设置为正常状态,但为什么不是吗?

我知道我可以使用NSTimer来执行此操作,但为什么以下代码不起作用?

谢谢。

3 个答案:

答案 0 :(得分:2)

jackslash 很好地解释了发生了什么。

您可以将代码更改为以下内容:

[image setHighlighted:true];
[self performSelector:@selector(aMethodThatChangesTheHighlight) withObject:self afterDelay:1];

最后请注意,冻结主线程通常是一个坏主意。

答案 1 :(得分:1)

只有在方法返回后才会对屏幕进行更改。然后,所有更改都会合并并立即生成。在这种情况下,当你正在睡觉主线程时,你的方法不会返回,直到你不突出显示图像。在您的方法返回后,UIKit会查看是否需要绘制任何更改。由于您在方法返回之前撤消了更改,因此无需执行任何操作,因此显示屏上不会发生任何更改。

最好的办法是看看你是否可以使用UIView类动画方法。

[UIView animateWithDuration:0.5 
                      delay:0 
                    options:UIViewAnimationCurveEaseInOut 
                 animations:^{
                       //animation code goes here
                       //note that you have to change something that UIView considers to be animatable
                       //e.g.
                       self.myView.alpha = 0;

                 } completion:^(BOOL done){
                       //code to execute once the animation has completed goes here
                 }];

答案 2 :(得分:0)

我更喜欢sch的答案,但如果您想使用动画作为jackslash建议,则必须使动画更改为可视化,以便完成块不会立即运行。甚至不添加“延迟”将解决这个问题。

MyImage.alpha = 0.99f;
[UIView animateWithDuration:1.0f delay:0.0f options:UIViewAnimationOptionAllowUserInteraction animations:^{
    MyImage.alpha = 1.0f;
    [MyImage setHighlighted:YES];
} completion:^(BOOL finished) {
    [MyImage setHighlighted:NO];
}];