我目前正在制作自定义主题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也被弃用了 基于项目的界面。
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 :(得分: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()
}