2015-02-24 27 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() 
} 
相關問題