2015-02-24 29 views
20

我目前正在定制主题NSButton。我发现的每个教程或指南都需要子类NSButtonCell,甚至the guide from Apple如何创建一个自定义的主题NSButton而不创建NSButtonCell的子类?

所有这些似乎都已过时,因为NSControl中的所有单元格方法都是deprecated in Yosemite。我还没有找到任何建议或指导如何使用替代品。

这是唯一的语句,我可以找到:

的NSCell

的逐渐弃用

的Mac OS X 10.10采取对 细胞的最终弃用又迈进了一步。不鼓励对控制单元的直接访问,并且允许其的方法将在随后的 版本中被正式弃用。各种单元级API已被提升为各种控制子类,以便提供对重要功能的无细胞访问。 NSLevelIndicator,NSTextField,NSSearchField,NSSlider, 和NSPathControl都具有用于此目的的新属性。基于单元的 现在不推荐使用NSTableViews,而应该使用基于视图的NSTableViews,而应该使用 。基于矩阵的NS浏览器也被弃用,以支持基于项目的接口 。

摘自:AppKit Release Notes for OS X v10.10

NSButton无话虽然。

NSTextField支持层支持视图;因此,我在我的NSButton上尝试了相同的方法,但这没有效果。

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

作为一个小方面说明,如果您愿意,我一直在创建自定义视图 - 然后在其上创建一个隐形按钮。节省很多头痛。 – 2015-02-24 20:48:40

+0

您可以简单地将您的主题作为按钮的背景图像。 – 2015-02-25 06:47:21

+0

@MattyAyOh看起来很容易,但更像是一个黑客。我不认为这是做这件事的目的,我想知道预期的方式。但感谢分享这个窍门。 – Afterlame 2015-03-03 15:33:38

回答

3

我肯定会花更多的时间看看layer-backed view的方法。我不确定它为什么不适合你,因为没有理由让图层不能在NSButton(实际上是NSView衍生物)上工作。

同时重视更多的层次是你提到的动画。

从项目我工作(自定义NSButton)中提取的某些代码:

由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 

然后你可以在特定的显示周期进行细粒度的控制与层:

override var wantsUpdateLayer:Bool{ 
    return true 
} 

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

如果您的自定义按键需要的形状,那么你甚至可以用以下CAShapeLayer,让您的衬垫层的特殊形状...详细ŧ o被调查。

override func makeBackingLayer() -> CALayer { 
    return CAShapeLayer() 
} 
相关问题