2010-09-05 46 views
7

我有一個層託管視圖在一個定製NSView子類設置是這樣的:調用setNeedsDisplay:YES上層託管視圖不重繪視圖

[self setLayer:rootLayer]; 
[self setWantsLayer:YES]; 

我所有的子層添加到層樹在每個子圖層上調用setNeedsDisplay之後。每個圖層的內容由我的圖層委託的drawLayer:inContext方法提供。

這裏是我的問題:

初始化我的觀點後認爲得到正確繪製。但是,當模型發生變化時,我從視圖控制器呼叫[myCustomView setNeedsDisplay:YES];,則不會調用drawLayer:inContext

我很困惑,現在如何更新視圖:

  • 我必須呼籲各的CALayer的setNeedsDisplay方法層樹?
  • 在圖層託管視圖上不應該調用setNeedsDisplay:YES本身觸發整個圖層樹的重繪?

感謝您的幫助。

編輯

我已經發現一些在的NSView類引用

阿層支持的觀點是,通過核心動畫層支持的圖。任何由視圖完成的繪圖都會緩存在背景層中。您只需調用setWantsLayer:值爲YES來配置層次支持的視圖。視圖類將自動爲您創建一個支持圖層,並使用視圖類的繪圖機制。當使用層次支持的視圖時,您不應該直接與圖層進行交互。

圖層託管視圖是包含您打算直接操作的核心動畫圖層的視圖。通過實例化Core Animation圖層類的實例並使用視圖的setLayer:方法設置該圖層,可以創建圖層託管視圖。完成之後,您將調用setWantsLayer:值爲YES。當使用圖層託管視圖時,您不應該依賴該視圖進行繪製,也不應該將子視圖添加到圖層託管視圖。

link to documentation

在我來說,我有一個層託管視圖。那麼這是否確實意味着我必須手動觸發重繪?我是否應該在自定義NSView中實現一個僞drawRect方法來調用更改後的CALayers上的相應setNeedsDisplay?

回答

9

經過對蘋果公司的sample code進一步研究,我發現如果您使用圖層託管視圖,您必須自己處理由於模型更改而需要的屏幕更新。在NSView上調用setNeedsDisplay:YES將不會執行任何操作。

因此,如果必須更新視圖,必須編寫一個像reloadData這樣的方法,並且在每個需要刷新的CALayer上應該調用setNeedsDisplay。我仍然不確定在根層上調用此方法是否會傳播所有子層,但我不這麼認爲。

我現在通過致電setNeedsDisplay解決了個別CALayers需要recaching的問題。它工作沒有問題。

+0

您的示例代碼鏈接已損壞,也許這是替換:https://developer.apple.com/library/mac/samplecode/CoreAnimationKioskStyleMenu/Introduction/Intro.html#//apple_ref/doc/uid/ DTS40009512 – 2014-05-16 17:44:23

2

還有有一個空的「的drawRect」,一拉-(void) drawRect:(NSRect)dirtyRect {}幫助強制東西變成圖紙,的通過老好人view.needsDisplay = YES;一個經常使用的做法,我相信

和應該注意..什麼是確實發生的事情是 - 說出你的NSView *view;layer.delegate = view;導致要繪製的層時[layer setNeedsDisplay];被稱爲....通過- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {...} ..

沿同一靜脈...說[layer setNeedsLayout];- (void) layoutSublayersOfLayer:(CALayer *)layer {..}方法的實現將只履行layer.layoutManager = view ...後續需求..當

這些重要概念掩蓋了/在蘋果的文檔四散......他們是真的有這麼完全可以完成任何工作的關鍵。

+0

你能否解釋一下更多初學者友好的方式。 – carbonr 2015-11-12 07:16:49

+0

@carbonr我知道它很混亂。但我所說的就是這麼簡單。如果事情沒有正確顯示,並且你的視圖是圖層的委託。你需要實現'drawLayer:inContext',也許有一個空的'drawRect:'並且調用'setNeedsDisplay'。如果你必須閱讀它10次,但信息都在那裏。如果我沒有記錯,那就是。 ;) – 2015-11-12 07:32:51