2010-06-15 162 views
3

我正在開發一個桌面應用程序,其中我想更改NSWindow標題欄的顏色。我該如何做到這一點?更改NSWindow標題欄的顏色

+0

你可能想簽出以下問題: http://stackoverflow.com/questions/1665147/how-to-custom-draw-window-title-bar-in- objective-c/1665421#1665421 – Leibowitzn 2010-06-15 18:14:12

+0

我發佈了答案。檢查我的[在這裏回答](http://stackoverflow.com/a/20016023/2515572) – 2013-11-16 07:35:18

回答

4

NSWindow的內容視圖有一個superview,它是NSThemeFrame的一個實例。該類負責繪製標題文本,窗口/工具欄背景紋理,並且它包含其他所有內容(關閉按鈕,全屏按鈕,NSDocument圖標等)的子視圖。

您可以使用Objective-C運行時用您自己的方法替換NSThemeFrame的drawRect:方法,該方法將調用父實現,然後在其上執行自定義繪圖。

還有一個私人的方法來找到標題繪製的矩形和NSFont上的公共方法來找到它的字體和字體大小。

我所做的是將窗口背景顏色設置爲純色(黑色)而不是漸變/紋理,然後將其設置爲「紋理」窗口(這會導致背景顏色實際呈現,否則它不會發生),然後在我知道標題已經繪製的區域的標題欄上繪製一個黑色方塊,然後在它的位置繪製我自己的標題,使用淺灰色而不是深灰色。

源代碼是在這裏:https://github.com/abhibeckert/Dux/blob/master/Dux/DuxProjectWindow.m(注:它只做一個自定義標題文字的顏色,如果DUX_DARK_MODE == 1)

這樣做可能會得到來自Mac App Store的封鎖您的應用程序,但它是相當可靠。只要確保你與OS X的每一個新的主要版本

1

它使用私有方法測試,但工作原理:

NSEnumerator *viewEnum = [[[[[[window contentView] superview] titlebarViewController] view] subviews] objectEnumerator]; 
NSView *viewObject; 

while(viewObject = (NSView *)[viewEnum nextObject]) { 
    if([viewObject className] == @"NSTextField") [viewObject setTextColor: .. your color .. ]; 
} 
+0

你如何強制Xcode接受私有方法的使用?我試圖效仿你使用Swift建議,它只是抱怨說「視圖沒有名爲titlebarViewController的成員」。 – Sam 2015-01-19 19:30:18

+0

嘗試將viewObject轉換爲NSTextField ...雖然 – 2015-04-16 07:00:07

5

要改變窗口的工具欄的顏色:

  1. 套裝窗口樣式在屬性檢查器中構造。
  2. 在代碼:[window setBackgroundColor: MyCustomColor];
+0

仍然不適用於我的應用程序,但這對我來說很合適,而且非常簡單! – Volomike 2016-01-09 20:52:33