2015-03-19 19 views
8

Ich habe ein benutzerdefiniertes Layer-gesichertes NSView und habe die makeBackingLayer-Methode überschrieben, um eine benutzerdefinierte CALayer-Unterklasse zurückzugeben. Ich habe auch willedUpdateLayer überschreiben, um wahr zurückzugeben, indem ich mich vollständig für schichtartiges Zeichnen entschieden habe.Layer-unterstütztes NSView mit benutzerdefiniertem CALayer, der updateLayer nicht aufruft?

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 
} 

Wenn ich das tue, finde ich, dass, wenn ich NSView.needsDisplay = true es Routen gesetzt Anrufe an die drawInContext der benutzerdefinierten Schicht: Verfahren in Bezug auf den updateLayer Gegensatz: Methode. Warum macht es das? In meinem Beispiel habe ich überprüft, dass, wenn ich die makeBackingLayer Überschreibung entfernen, meine updateLayer in der erwarteten Weise aufgerufen wird.

Ich kann nicht ganz meinen Finger darauf legen, aber andere Instanzen verweisen auf die Vorstellung, dass Sie Ihre benutzerdefinierte Ebene in einer übergeordneten Sicherungsschicht gehostet haben, wenn Sie Ihre makeBackingLayer returns a custom CALayer. (Reine Spekulation meinerseits)

Würde es zwischen den beiden Zeichnungsrouten außerdem unterschiedliche Leistungsmerkmale geben, wenn CALayers drawInContext: eher "low-level" ist? Sehen Sie sich diese SO Frage für weitere Details zu dieser Frage an: Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

Jeder Einblick würde sehr geschätzt werden.

Antwort

0

Haben Sie vergessen, die Eigenschaften layerContentsRedrawPolicy und wantsLayer einzustellen?

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

Ich habe die Eigenschaft genau so, wie Sie es oben haben. Leider ist das nicht die Antwort. – Sam

2

Sicher fixiert man es nun aber für zukünftige Leser fand ich eine mögliche Erklärung durch die NSView documentation beim Lesen!

Wenn die canDrawSubviewsIntoLayer Eigenschaft auf JA gesetzt ist, wobei die Ansicht ignoriert den Wert von dieser Methode zurückgegeben. Stattdessen verwendet die Ansicht immer ihre drawRect: Methode, um ihren Inhalt zu zeichnen.