the programming lenguaje language documentación descargar apple macos cocoa swift

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() }