2014-03-29 56 views
0

我有一個窗口,裏面有一個自定義視圖。這個視圖得到了一個作爲背景繪製的圖像。現在我們假設它是一個結構化的灰色背景圖像。背景問題:NSView上的NSButton

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 
    [self.titlebarBGImage drawInRect:dirtyRect fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 
} 

在這個自定義視圖中,我添加了一個方形紋理按鈕,並在IB中將其配置爲沒有邊框。在我的AppDelegate我然後給該按鈕在applicationDidFinishLaunching方法的圖像:

// ... 
// [[self.minimizeButton cell] setBackgroundColor:[NSColor clearColor]]; 
[self.minimizeButton setImage:minimizeImage]; 
// ... 

不知何故相同的背景(titlebarBGImage)也繪製爲按鈕背景,因此它具有結構化灰色圖像,但縮放以適合按鈕大小。這看起來很愚蠢,並不是我想要的。如果我然後取消註釋setBackgroundColor:的行,背景被清除,但自定義視圖背景也不會透過按鈕圖像透明的位置(按鈕圖像是圓形),所以我得到一個矩形,其中的窗口背景透過( ,即在示例圖像綠色),而不是視圖按鈕在背景

下面是一個圖像,使其清楚發生了什麼:

enter image description here

從上到下:

  • 我要實現什麼,即觀點灰色結構BG彪炳按鈕透明區域
  • 我上的代碼,即沒有註釋掉線獲得:自定義視圖背景繪製擠進按鈕背景
  • 我得到什麼與clearColor線,即窗口顏色(綠色)閃耀通過,而不是視圖的bg。

如何獲得最高的結果?

編輯:我推了一個example project to github,以便你能看到我的意思。

+0

我改變了標題,並希望有人發現這種風滾草。我仍然需要一個答案,thx – beipawel

回答

0

解決此問題的一種方法是使用Core Animation Layers。我發現看着this tutorial。爲了達到你的MainMenu.xib文件,選擇Button對象並點擊Utilities中的layers選項卡(見截圖(1))。然後激活核心動畫層爲最頂層的視圖。由於所有子元素都有核心動畫層已激活(如果項目較大,可能會出現性能問題,請注意)。

How to activate Core Animation Layer

接下來,我子類的NSButton(稱之爲BPButtonView在我Github的項目,我現在更新)。選擇xib文件中的按鈕,並將自定義類別更改爲BPButtonView,或者您調用它的任何內容。

Don't forget to set the buttons correct class name in the Utilities sidebar

新NSButton子類的代碼如下所示:

@implementation BPButtonView 

- (BOOL)wantsUpdateLayer { 
    return YES; 
} 

- (void)updateLayer { 
    if ([self.cell isHighlighted]) { 
     self.layer.contents = [NSImage imageNamed:@"buttonbg.png"]; 
    } else { 
     self.layer.contents = [NSImage imageNamed:@"buttonbg.png"]; 
    } 
} 

@end 

我用if語句在updateLayer方法只是爲了顯示,這取決於按鈕狀態(按下VS 。未壓縮)你可以提供不同的圖片。在視頻教程中,如何實現按鈕圖片的乾淨調整也是一個不錯的竅門。

下面是生成的應用程序的屏幕截圖。中間的紅色圓圈是按鈕,綠色紋理的東西是視圖背景。

Resulting App with NSView background and a button placed in this view