2012-07-14 30 views
5

我正在努力與setNeedsDisplay。我認爲它應該觸發調用drawRect:來調用它的視圖以及下面的層次,如果它在視圖的範圍內,但我不認爲是這種情況。這是我的設置:setNeedsDisplay不會按預期在子視圖中觸發drawRect

從應用程序委託,我創建一個視圖,其大小是一個正方形,基本上涵蓋整個屏幕的房地產。這個視圖被稱爲TrollCalendarViewTrollCalendarView除了由指南針觸發的旋轉之外沒有太多的事情發生。

有7個子視圖TrollCalendarView調用PlatformView打算包含圍繞TrollCalendarView中心排列在7邊排列中的2D繪圖對象。因此,當iPad旋轉時,這7個視圖會旋轉,因此它們總是以基本方向爲導向。

每個PlatformView子視圖都包含3個子視圖Tower。每個塔包含在drawRect:中實現的2D繪圖對象。

因此,總的來說,我有TrollCalendarViewdrawRect:,和子視圖PlatformViewPlatformview - >塔,每個具有的drawRect實現。此外,Tower位於Platform的範圍內,Platform位於TrollCalendarView的範圍內。

TrollCalendarView我已經添加了滑動識別器。當我滑動發生,一個屬性更新,我打電話[self setNeedsDisplay]但似乎沒有發生。我在這些視圖中的每一個視圖中都添加了NSLog條目到drawRect:方法,並且只調用了TrollCalendarViewdrawRect:方法。具有諷刺意味的是,這是一個視圖,其方法將是空的。

沒有xib文件。

我需要做些什麼來確保其他子視圖中的drawRect方法被調用?是否有文檔介紹可能會影響到這一切的所有細微差別?

回答

7

我正在努力setNeedsDisplay。我認爲這是應該引起對於其被稱爲視圖和層次低於drawRect中的通話,如果它是視圖邊界

無內,事實並非如此。你從哪裏得到這個想法?

-setNeedsDisplay:僅適用於發送給它的視圖。如果您需要使其他視圖無效,則還需要添加一些代碼以將-setNeedsDisplay:發送給它們。這裏的所有都是它的。

+0

我從類似的問題的答案在這裏在stackoverflow得到了這個想法。只需搜索子視圖setNeedsDisplay以獲取樣本。有幾個。 – 2012-07-14 13:18:45

+0

我會遵循這個建議,除非我學到另一種方法。它至少符合我在測試中的發現。 – 2012-07-14 13:51:03

+1

不幸的是,在SO和很多盲人領先的盲人中存在很多噪音。你看到的問題只有很少的選票,所以可能沒有多少人看到他們或有機會改正他們。如果您剛開始使用,Apple文檔更可靠。 – 2012-07-14 16:24:14

5

我認爲這是一個框架的優化;如果您的子視圖不需要需要再次繪製,那麼這是一項重大的性能改進。意識到幾乎所有可以動畫化的東西都不需要拉直(移動,縮放等)。

如果您知道你的所有子視圖,應重繪(而不是簡單地移動),然後覆蓋setNeedsDisplay在你的主要觀點和這樣做:

-(void) setNeedsDisplay { 
    [self.subviews makeObjectsPerformSelector:@selector(setNeedsDisplay)]; 
    [super setNeedsDisplay]; 
} 

我已經進行了測試,它導致所有的子視圖也被重繪。請注意,如果你以某種方式過濾你的子視圖,並確保你只發送該子視圖實際上需要重繪 ...,甚至更多,如果你能弄清楚如何不是需要重繪它們。 :-)

+0

謝謝。我會嘗試。在我的情況下,7平臺子視圖不需要重繪。其餘21個子視圖中的三分之二將保證需要重新繪製。知道21中哪些需要重畫是在drawRect中有效地計算的,並且不能在其他地方更高效地完成。只是好奇 - 框架如何否決我的決定(你的優化評論)?看起來,這樣做首先會挫敗setNeedsDisplay的目的。 – 2012-07-14 13:16:52

+0

沒有。不起作用。這隻會得到子視圖。我需要重繪這些子視圖的子視圖。我決定在需要設置setNeedsDisplay的地方進行樹的走路工作。還是)感謝你的建議。 – 2012-07-14 13:52:25