2013-02-24 86 views
0

我想設置一個自定義UIView類的背景顏色。該課程還採用drawRect:方法進行石英拉伸。用drawRect設置UIView backgroundColor:

由於在下一次重繪視圖之前不會發生背景顏色變化,所以在調用setNeedsDisplay之前,我更改了UIView的backgroundColor屬性。我在視圖重繪時設置了一個UIActivityIndicatorView動畫。

self.backgroundColor = theColor; 
[indicator startAnimating]; 
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil]; 

該指標在setNeedsDisplay的末尾處停止。每當我需要調用這個時,theColor都會改變。

比方說我有一個耗時setNeedsDisplay的過程。我想設置背景並保持指標動畫。目前,更改backgroundColor調用setNeedsDisplay,但直到performSelectorInBackground方法運行才更改backgroundColor!因此,我的應用程序掛起,並沒有任何指標是動畫。 我該如何處理這個訂購問題?謝謝。

編輯:我的意思是說我的drawrect:可能很耗時。

+1

'setNeedsDisplay'不耗時,它是'drawRect:'。但不管怎樣,你都不應該調用'drawRect:'。 – 2013-02-24 01:00:39

回答

0

只能在主線程更新UI,而不是在backgroung

嘗試使用與活動的指標另一個子視圖,擺在面前重繪後

4

從上海華刪除比方說,我有一個耗時setNeedsDisplay process

讓我們不要。您沒有業務覆蓋setNeedsDisplay。我完全不清楚你最終想做什麼,但這整個問題似乎是對如何繪製的誤解。當你打電話給setNeedsDisplay(正如你所知道的那樣,你必須在主線程中完成),就是這樣;你脫穎而出,當重繪時刻到來時,你的視圖的drawRect:被調用。這是繪畫。

如果問題僅僅是活動指標永遠不會發生,那是因爲你從不給它一個機會。直到重繪時刻,它也不會開始。但是,在重繪時刻到來之前,您正在停止活動指示器!所以顯然你永遠不會看到它。

在下一件事情發生之前,明確地啓動活動指示器的方法是在之後的下一個重繪時刻步出主線程。這被稱爲「延遲表現」。例如:

self.backgroundColor = theColor; 
[indicator startAnimating]; 
double delayInSeconds = 0.1; 
dispatch_time_t popTime = 
    dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    // do something further, e.g. call setNeedsDisplay 
}; 

你可以通過調用dispatch_after再次停止指示後下一個重繪時刻延長該例子。

但是,我必須給你留下深刻的印象,如果單純的繪畫行爲需要很長的時間以至於你需要一個活動指標來覆蓋它,那麼你就錯誤了。你的繪畫行爲必須非常快。您可能想觀看關於這個話題的WWDC 2012視頻;它提供了關於如何有效繪製的優秀技巧。

+0

對不起,我的意思是我的drawrect方法可能需要一段時間。繪圖的複雜性取決於用戶的輸入,因此我正在努力做好最糟糕的準備。從我記憶中來看, AnsonL 2013-02-24 04:27:14

+0

@AnsonL如果你的drawrect:方法需要一段時間,那麼你需要將它分解出來。正如馬特所說,這個主題上有一個很棒的WWDC2012視頻(儘管在這種情況下,它是關於多線程的,而不是繪圖)。你需要做的是將繪圖工作放在單獨的線程上(在UIImage上工作而不是實際的視圖?),然後一旦完成將數據移植到主線程以更新UI。 – RonLugge 2013-02-24 04:36:49

+0

@AnsonL重讀我說的話:不要讓我重複自己。你的'drawRect:'不應該花一點時間。你必須畫_fast_。你不需要派遣來做延遲的表演;如果您不瞭解延遲的性能或線程,請閱讀我的書:http://www.apeth.com/iOSBook/ch38.html,http://www.apeth.com/iOSBook/ch11.html #_delayed_performance。首先觀看那些WWDC視頻;我特別想到WWDC 2012會議235和238. – matt 2013-02-24 15:59:04