macos - programming - ¿Cómo crear un NSButton temático personalizado sin subclasificar NSButtonCell?
the swift programming language pdf (1)
Actualmente estoy trabajando en un NSButton
temático personalizado. Todos los tutoriales o guías que he encontrado requieren la subclase NSButtonCell
, incluso la guía de Apple .
Todos esos parecen estar desactualizados, porque todos los métodos de celda en NSControl
están en desuso en Yosemite . No he encontrado ninguna recomendación o guía sobre qué usar como sustituto.
Esta es la única afirmación, podría encontrar:
Desaprobación gradual de NSCell
Mac OS X 10.10 da otro paso hacia la eventual eliminación de las células. Se desaconseja el acceso directo a la celda de un control, y los métodos que lo permiten se descartarán formalmente en una versión posterior. Se ha promovido una variedad de API de nivel de celda a varias subclases de Control para proporcionar acceso sin celular a funcionalidad importante. NSLevelIndicator, NSTextField, NSSearchField, NSSlider y NSPathControl tienen propiedades nuevas para este propósito. Las NSTableViews basadas en celdas ahora están en desuso y, en su lugar, se deben usar NSTableViews basadas en vistas. Los NSBrowsers basados en matriz también están en desuso a favor de la interfaz basada en elementos.
Extracto de: Notas de la versión de AppKit para OS X v10.10
Sin embargo, no hay palabras en NSButton
.
NSTextField
soporta vistas de capa respaldada; debido a eso, intenté el mismo enfoque en mi NSButton
, pero eso no tiene ningún efecto.
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
Definitivamente pasaría más tiempo mirando el enfoque de layer-backed view
. No estoy seguro de por qué no funcionó para usted porque no hay razón para que las capas no funcionen en un NSButton
(en realidad un derivado de NSView
).
También su peso en mirar más en capas es su mención de la animación.
Algún código extraído de un proyecto en el que estoy trabajando ( NSButton
personalizado):
Desde 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
Luego puede obtener un control preciso en el ciclo de visualización específico de las capas con:
override var wantsUpdateLayer:Bool{
return true
}
override func updateLayer() {
// your code here
super.updateLayer()
}
Si su botón personalizado necesita una forma, incluso puede usar un CAShapeLayer a continuación para hacer que su capa de respaldo tenga una forma especial ... más detalles para mirar.
override func makeBackingLayer() -> CALayer {
return CAShapeLayer()
}