如何在不创建NSButtonCell子类的情况下创建自定义主题NSButton?

时间:2015-02-24 16:05:37

标签: macos cocoa swift

我目前正在制作自定义主题NSButton。我发现的每个教程或指南都需要继承NSButtonCell,甚至the guide from Apple

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

这是我能找到的唯一声明:

  

逐步弃用NSCell

     

Mac OS X 10.10向最终弃用迈出了新的一步   细胞。不鼓励直接访问控件的单元格   允许它的方法将在随后正式弃用   发布。各种细胞级API已被推广到各种各样的   控制子类以便提供重要的无细胞访问   功能。 NSLevelIndicator,NSTextField,NSSearchField,NSSlider,   和NSPathControl都有为此目的的新属性。基于细胞的   NSTableViews现已弃用,基于视图的NSTableViews应该是   用来代替。基于矩阵的NSBrowser也被弃用了   基于项目的界面。

     

摘自: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

1 个答案:

答案 0 :(得分:4)

我肯定会花更多时间研究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使你的背衬层成为一个特殊的形状......更多细节需要研究。

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