2015-03-19 19 views
8

Ho un NSView personalizzato con strato layer e ho sostituito il metodo makeBackingLayer per restituire una sottoclasse CALayer personalizzata. Ho anche overriden wantUpdateLayer per restituire true, optando quindi completamente in un disegno simile a un livello.NSView con backup NSView con CALayer personalizzato che non chiama 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 
} 

Una volta che lo faccio, trovo che quando ho impostato NSView.needsDisplay = true instrada le chiamate al drawInContext del livello personalizzato: metodo in contrasto con l'updateLayer: metodo. Perché lo fa? Nel mio esempio, ho controllato che se rimuovo l'override makeBackingLayer, il mio updateLayer viene chiamato nel modo previsto.

Non riesco a metterci il dito sopra, ma altre istanze indicano che quando esegui makeBackingLayer returns a custom CALayer` in realtà il tuo livello personalizzato è ospitato all'interno di un livello di supporto principale. (Pure Speculation da parte mia)

Inoltre, ci sarebbero caratteristiche di performance diverse tra i due percorsi di disegno dato che drawInContext di CALayer: è più "di basso livello"? Vedi questa domanda SO per maggiori dettagli su quella domanda: Layer-backed NSView performance with rendering directly in CALayer.drawInContext:

Qualsiasi intuizione sarebbe molto apprezzata.

risposta

0

Hai dimenticato di impostare le proprietà layerContentsRedrawPolicy e wantsLayer?

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

Ho la proprietà esattamente come ce l'hai sopra. Sfortunatamente non è questa la risposta. – Sam

2

Sicuramente fissata fin d'ora, ma per i futuri lettori ho trovato una possibile spiegazione leggendo il NSView documentation!

Se la proprietà canDrawSubviewsIntoLayer è impostato su YES, la vista ignora il valore restituito da questo metodo. Invece, la vista sempre utilizza il suo metodo drawRect: per disegnare il suo contenuto.

Problemi correlati