2015-03-19 26 views
8

我有一個自定義層支持的NSView,並且已經使用makeBackingLayer方法來返回一個自定義的CALayer子類。我也重寫wantUpdateLayer來返回true,從而完全選擇層狀繪圖。圖層支持NSView與自定義CALayer不調用updateLayer?

override func makeBackingLayer() -> CALayer { 
    return Layer() // my custom class with "drawLayer:" implemented 
} 

override var wantsUpdateLayer:Bool{ 
    return true 
} 

// never called 
override func updateLayer() { 
    super.updateLayer() 
    println("updateLayer after") 
    self.layer?.borderWidth += 1 
} 

一旦我這樣做,我發現,當我設置NSView.needsDisplay = true其呼叫路由到定製層的drawInContext:方法:爲反對updateLayer方法。 它爲什麼這樣做?在我的例子中,我檢查瞭如果我刪除了makeBackingLayer覆蓋,我的updateLayer以預期的方式被調用。

我不能完全明白這一點,但其他實例指出,當您的makeBackingLayer圖層爲CALayer時,您實際上已將自定義圖層託管在父支持圖層內。 (對我而言,純粹的猜測)

此外,考慮到CALayer的drawInContext:更「低級」,兩種繪製路線之間會有不同的性能特徵嗎?看到這個問題的更詳細的問題:Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

任何有識之士將不勝感激。

回答

0

您忘了設置layerContentsRedrawPolicywantsLayer屬性嗎?

self.wantsLayer = YES; 
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay; 
+0

我的財產就像上面那樣。不幸的是,這不是答案。 – Sam 2015-03-19 10:57:35

2

當然,你現在修好了,但對於未來的讀者我發現了一個可能的解釋通過閱讀NSView documentation

如果canDrawSubviewsIntoLayer屬性設置爲YES,則視圖 將忽略此方法返回的值。相反,視圖總是 使用其drawRect:方法來繪製其內容。