2012-05-30 30 views
59

在創建iPhone/iPad應用程序時,我很困惑,究竟何時需要調用setNeedsDisplay?我知道它與更新/重繪UI有關;但是,每次更改我的任何視圖時,是否都需要調用此方法?我什麼時候需要在iOS中調用setNeedsDisplay?

例如,我需要調用它:

  • 編程改變文本的文本字段
  • 當改變視圖的背景後?
  • 當我在viewDidLoad中進行更改時?
  • 怎麼樣在viewDidAppear?

有人能給我一些關於何時使用這種方法的一般指導?謝謝

回答

122

如果您在UIView的子類中重寫drawRect,它應該只是調用setNeedsDisplay,它基本上是一個自定義視圖,在屏幕上繪製某些東西,如線條,圖像或矩形等形狀。

因此,當您對該圖形所依賴的少數變量進行更改時,應該調用setNeedsDisplay,並且爲了表示該更改,您需要調用此方法,該方法將在內部調用drawRect並重繪組件。

當您將imageView或UIButton作爲子視圖添加或對任何子視圖進行更改時,無需調用此方法。

實施例:

您有一個視圖,示出了移動圓,任你觸摸並移動它,或者可以是基於定時器的動畫。 現在爲此,您需要一個自定義視圖,該視圖在給定中心和給定半徑處繪製一個圓。 這些被保存爲實例變量,通過改變其中心來移動圓或者通過增加圓的半徑來增大它。

現在在這種情況下,您可以在循環和計時器中修改這些變量(中心或半徑),也可以通過手指在touchesEnded和touchesMoved方法中修改。 要反映此屬性的更改,您需要重新繪製此視圖,您將爲其調用setNeedsDisplay。

+0

相同的後,我改變了我的視圖子類內的圖層或視圖的框架? –

9

你只需要真的需要調用-setNeedsDisplay UIView子類,它們的內容與-drawRect:

對於標籤和其他標準控件,更改文本會自動重新繪製標籤,所以您不需要自己做這個。

5

setNeedsDisplay:應該在您想要明確刷新您的視圖時調用。它只是設置一個內部標誌,iOS UI系統將在稍後的適當時間調用drawRect:

聽起來好像應該在更新任何可能會更改演示文稿的屬性時始終調用它。但事實並非如此。幾乎所有的標準UI控件都已經處理了。我相信,無論何時修改標準UI組件(視圖)的屬性,setNeedsDisplay:都會在內部觸發,並且受影響的區域將被重新繪製。(在您列出的所有情況下)

但是,如果您創建自己的視圖,請實施其自己的視圖drawRect:,並且想要更新某些已更改的內容時,必須明確呼叫setNeedsDisplay:

1

我認爲@Amogh Talpallikar說清楚了。我只想討論一件事。

事實上,你應該避免覆蓋drawRect,除非你真的需要它,因爲它可能會導致不良的性能。你可以參考這個https://yalantis.com/blog/mastering-uikit-performance/

如果你只希望改變幀的按鈕,標籤位置,......你可以叫setNeedLayoutlayoutIfNeeded

1

你會打電話的時候你正在更改屬性setNeedDisplay上視圖定製畫取決於。它會強制地顯式調用drawRect:方法。

相關問題