2014-01-10 36 views
1

我不明白這裏發生了什麼。我有一個進度條几乎完成,但沒有顯示出來。如果我遞增.10,它會停止在.9左右,它看起來很直觀,我可以弄清楚如何解決它。uiprogressview沒有完成到100%視覺

float total = self.forms.count; 

    float calc = (float)self.progView.progress + (1/total); 
    self.progView.progress = calc; 
    if (self.progView.progress == 1) 
    { 

     sleep(2); 
     self.progView.hidden = YES; 
       self.progView.progress = 0; 
    } 

我知道它進入if語句,因爲它會睡2秒鐘這樣 enter image description here

編輯:

嗯,我拿出了最後的2線和它似乎更新最後一部分,它必須是塊的問題,我已經從它被調用?

即使用這種方法包裝在dispatch_async(dispatch_get_main_queue()我仍然有問題。

睡眠不好在主線程:

這裏是我的新工作代碼:

if (self.progView.progress == 1) 
    { 
     [NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(removeProg) userInfo:nil repeats:NO]; 
    } 

方法

-(void)removeProg 
{ 
    self.progView.hidden = YES; 
    self.progView.progress = 0; 
} 
+0

永不睡在主線程上。 Ver壞。 – rmaddy

+0

我有類似的問題,這有助於我得到一個滿意的結論。 – Bill

回答

2

這一切都與如何繪製的作品做iOS版。當你要求它時,它不會發生。它晚點發生!界面更新只有我們來到「重繪時刻」。這隻能在所有代碼停止運行後纔會發生。在此之前,所有更新界面的命令都是毫無意義的。當「重繪時刻」到來時,將執行所有累積的更新接口的命令。如果多個累計命令影響接口的相同功能,則只有最後一個統計功能有效。

那麼讓我們來看看你的代碼:

self.progView.progress = calc; 
if (self.progView.progress == 1) 
{ 
    sleep(2); 
    self.progView.hidden = YES; 
    self.progView.progress = 0; 
} 

比方說,progress爲0.9。現在您將progress設置爲calc,假設calc爲1.但是沒有重畫時刻,因此界面不會更改。我們仍然看到.9的溫度計。您的代碼將繼續運行,並且您將progress設置爲0.現在您的代碼結束了。 現在有重繪時刻。因此,從溫度計1.9至0跳躍而不會在1

一個簡單的平行實驗曾經被顯示是這樣的:

myView.backgroundColor = [UIColor greenColor]; 
sleep(2); 
myView.backgroundColor = [UIColor redColor]; 

你永遠不會看到的觀點變成綠色,因爲當重繪時刻最後一條命令是將它變成紅色,這就是所出現的。

從技術上講,當運行時向您發送一個啓動您的代碼運行的事件時,CATransaction就開始了。當所有代碼完成運行並且運行時的原始事件完成時,CATransaction就會「提交」,我們將進行一系列清理。這包括完成所有累積的繪圖以及啓動任何請求的動畫。

+0

永不睡在主線上。 – rmaddy

+0

那麼我該如何解決這個問題? – BluGeni

+0

@BluGeni我不知道你想完成什麼!你的問題是,你不明白你的代碼爲什麼會導致它造成的行爲。我解釋了它。 – matt