2013-01-06 32 views
0

我有一個例程,使用CoreGraphics和drawRect繪製一個大齒輪。我經歷的階段中使用的按鈕,前進齒輪:強制setNeedsDisplay

- (IBAction爲)advanceButtonPressed:(ID)發送方{

stage=stage+1; 

if (stage==4) stage=0; 

[self setNeedsDisplay]; 

}

繪製齒輪該例程在的drawRect,和齒輪的齒根據階段的值被拉到一個新的位置,並傳遞給drawRect。在四個步驟中,每按一次按鈕,齒輪就轉到它的新位置(圍繞圓的一段)。

我改變了buttonPressed例程,讓它在一個循環中完成四個階段,所以我只需要按下按鈕一次,但它不工作:

- (IBAction爲)buttonPressed:(ID)發送{

for (stage=0;stage<4;stage++){ 

    NSLog(@"%i",stage); 

[self setNeedsDisplay]; 
} 

}

我的NSLog顯示這一階段經歷了四個值,只是就像在早先的例程中那樣。但是setNeedsDisplay只執行一次,(因爲drawRect中的NSLog曲線確認了),所以齒輪顯示在其最終位置,而不是中間階段。它看起來像setNeedsDisplay只在按鈕例程完成時執行,儘管它在循環內部。

有沒有辦法強制它執行?

回答

2

iPhone目前只更新屏幕60次第二,無論你如何經常打電話setNeedsDisplay。你的循環將在不到1/60秒的時間內執行。這就是爲什麼你只會看到最後一個狀態。

如果你想通過一個按鈕顯示所有四種狀態,那麼你可以使用定時器或performSelector: afterDelay來顯示所有四種狀態。稍微複雜一些,但你去了。

+3

屏幕刷新率無關緊要;它直到方法返回之後才真正顯示的原因是因爲這就是Cocoa和Cocoa Touch中的繪圖工作。循環需要多長時間無關緊要;即使你花了整整一分鐘,直到你的代碼返回到運行循環的控制,仍然不會發生繪圖。 http://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW10 –

+0

定時器運行良好。感謝您的建議 –

-2

調用setNeedsDisplay只會標記要在下一個繪製週期重繪的視圖。

要你的方法時重繪,你可以顯式調用的drawRect:

+0

你不應該明確地調用'drawRect:'。 [文檔](http://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#//apple_ref/doc/uid/TP40010156-CH14-SW3)建議反對它,即使它被允許,在這種情況下這樣做只會浪費用戶的電池時間。正確的解決方案是skinnyTOD建議的內容:使用一個定時器,依次顯示每個狀態,並且有足夠的時間間隔給系統一個調用'drawRect:'的機會,並允許用戶看到變化。 –