2012-02-17 69 views
1

之前我寫了下面的代碼:視圖控制器不更新的睡眠

代碼:

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

我需要突出自己的形象一秒鐘,之後拿回來,但X-代碼時到貨到[MyImage setHighlighted:true]沒有任何事情(我知道它這樣做)之後,睡眠執行和主線程的應用程序進入睡眠1秒,然後執行最後一行,但我的問題是爲什麼第一行不要更新UI,我可以在用戶界面中看到任何東西。

在第一行代碼中,Sleep方法沒有執行,主線程處於正常狀態,它應該將我的圖像設置爲高亮,之後進入休眠狀態1秒鐘,然後將圖像設置爲正常狀態,但爲什麼不 ?

我知道我可以使用NSTimer來做到這一點,但爲什麼下面的代碼不起作用?

謝謝。

回答

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 
       }]; 
+0

這樣做的問題是,由於沒有動畫,所以完成塊立即執行。奇怪的,但是是真的。 – picciano 2012-02-17 19:17:10

+0

同意。 sch有一個很好的解決方案。 – jackslash 2012-02-17 19:26:41

2

jackslash很好地解釋發生了什麼。

你可以改變你的代碼是這樣的:

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

最後需要指出的凍結主線程通常是一個壞主意。

0

我更喜歡sch的答案,但是如果您想使用動畫作爲插槽提示,則必須將動畫更改爲可視化,以便完成塊不會立即運行。即使添加「延遲」也不能解決這個問題。

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]; 
}];