2015-02-24 12 views
20

Attualmente sto lavorando a un tema personalizzato NSButton. Ogni tutorial o guida che ho trovato richiede sottoclasse NSButtonCell, anche the guide from Apple.Come creare un NSButton personalizzato a tema senza sottoclasse NSButtonCell?

Tutti questi sembrano essere obsoleti, perché tutti i metodi di cella in NSControl sono deprecated in Yosemite. Non ho trovato alcun consiglio o guida su cosa usare come sostituto.

Questa è l'unica affermazione, sono riuscito a trovare:

deprecazione graduale NSCell

Mac OS X 10.10 compie un ulteriore passo verso l'eventuale disapprovazione di cellule. L'accesso diretto alla cella di un controllo è sconsigliato e i metodi che lo consentono verranno ufficialmente ritirati in una successiva versione . Una varietà di API a livello di cella sono state promosse in varie sottoclassi di controllo per fornire un accesso senza cella alle importanti funzionalità di . NSLevelIndicator, NSTextField, NSSearchField, NSSlider, e NSPathControl hanno tutti nuove proprietà per questo scopo. basati su celle sono ora deprecati e NSTableViews basati sulla visualizzazione dovrebbero essere usati come . Anche gli NSBrowser basati su matrici sono deprecati a favore di l'interfaccia basata su elementi.

Estratto da: AppKit Release Notes for OS X v10.10

Non ci sono parole in NSButton però.

NSTextField supporta viste con layer supportati; a causa di ciò, ho provato lo stesso approccio sul mio NSButton, ma questo non ha alcun effetto.

var btn = NSButton(NSMakeRect(0, 0, 50, 20)) 
btn.wantsLayer = true 
btn.bordered = false 
btn.layer?.backgroundColor = NSColor(calibratedWhite: 0.99, alpha: 1).CGColor 
btn.layer?.borderWidth = 1 
btn.layer?.borderColor = NSColor(calibratedWhite: 0.81, alpha: 1).CGColor 
+0

Come una piccola nota a margine, un trucco se lo si desidera, ho creato visualizzazioni personalizzate, quindi facendo un pulsante invisibile su di esso. Salva un sacco di mal di testa. –

+0

Si può semplicemente dare il tema come immagine di sfondo del pulsante. –

+0

@MattyAyOh sembra facile, ma più simile a un hack.Non penso che questo sia il modo previsto per farlo e mi piacerebbe sapere il modo previsto. Ma grazie per aver condiviso questo trucco. – Afterlame

risposta

3

Trascorrerei sicuramente più tempo a esaminare l'approccio layer-backed view. Non sono sicuro del motivo per cui non ha funzionato per te perché non c'è motivo per cui i livelli non funzionino su un NSButton (in effetti un derivato NSView).

Anche il fatto di guardare più negli strati è la tua citazione dell'animazione.

Alcuni codice estratto da un progetto cui sto lavorando (personalizzato NSButton):

da init() ...

self.wantsLayer = true 
    self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay 

    self.layer?.borderColor = NSColor.gridColor().CGColor 
    self.layer?.borderWidth = 0.5 
    self.layer?.backgroundColor = NSColor.whiteColor().CGColor 

È quindi possibile ottenere il controllo a grana fine del ciclo di visualizzazione specifico a strati con:

override var wantsUpdateLayer:Bool{ 
    return true 
} 

override func updateLayer() { 
    // your code here 
    super.updateLayer() 
} 

Se il pulsante personalizzato ha bisogno di una forma, allora si può anche utilizzare un CAShapeLayer qui sotto per rendere il vostro strato di supporto di una particolare forma ... più in dettaglio t o essere esaminato

override func makeBackingLayer() -> CALayer { 
    return CAShapeLayer() 
} 
Problemi correlati