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.
Ho la proprietà esattamente come ce l'hai sopra. Sfortunatamente non è questa la risposta. – Sam