2015-03-19 39 views
8

Mam niestandardowy NSView z warstwą i nadpisałem metodę makeBackingLayer, aby zwrócić niestandardową podklasę CALayer. Przesłoniłem także moduł requireUpdateLayer, aby zwrócił wartość true, w ten sposób definiując w pełni rysowanie warstwowe.Powielony warstwowo NSView z niestandardową CALayer nie wywoływanie 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 
} 

Kiedyś to zrobić, uważam, że kiedy ustawić NSView.needsDisplay = true trasy wzywa do drawInContext niestandardowego warstwy: metoda, w przeciwieństwie do updateLayer: metody. Dlaczego to robi? W moim przykładzie, sprawdziłem, że jeśli usunę nadpisanie makeBackingLayer, mój updateLayer jest wywoływany w oczekiwany sposób.

Nie mogę tego do końca określić, ale inne przypadki wskazują na to, że podczas tworzenia twojej warstwy niestandardowej hostowane są w macierzystej warstwie nośnej. (Czyste spekulacje z mojej strony)

Co więcej, czy byłyby różne charakterystyki wydajności pomiędzy dwiema trasami rysowania, biorąc pod uwagę, że CALayer's drawInContext: jest bardziej "niskiego poziomu"? Więcej informacji na ten temat można znaleźć w odpowiedzi na to pytanie: Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

Każdy wgląd byłby mile widziany.

Odpowiedz

0

Czy zapomniałeś ustawić właściwości layerContentsRedrawPolicy i wantsLayer?

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

Mam nieruchomość dokładnie tak, jak masz ją powyżej. Niestety to nie jest odpowiedź. – Sam

2

pewno naprawić go teraz, ale dla przyszłych czytelników Znalazłem możliwe wyjaśnienie czytając NSView documentation!

Jeśli właściwość canDrawSubviewsIntoLayer jest ustawiona na TAK, widok ignoruje wartość zwracana przez tą metodą. Zamiast tego, widok zawsze używa metody, aby narysować jego zawartość.