2011-08-05 37 views
6

我想爲我的應用程序創建一個自定義開關,其中爲可能的狀態(開,關,mousedown)提供三個圖像。整個外觀都包含在圖像中,所以我不希望Cocoa在mousedown期間自己突出(變暗)按鈕。用圖像自定義NSButtonCell並突出顯示

此刻,我創建了一個NSButtonCell子類,將NSButtonTypeMomentaryChange的斜角按鈕拖到我的視圖中,並將按鈕單元類類型自定義爲我的子類。子類只是實現awakeFromNib嘗試,並設置一些預期的行爲:

- (void)awakeFromNib 
{ 
    [self setShowsStateBy:NSContentsCellMask]; 
    [self setHighlightsBy:NSContentsCellMask]; 
} 

而且我認爲他(根據文檔)將禁用按鈕的鼠標按下昏暗。它不是。

這是我的立場,現在我有兩個問題:

  • 我如何設置類扣式只顯示我的鼠標按下準備好的圖片,不變暗/畫按鈕周圍的邊界?
  • 什麼是最乾淨/最正確的方式來實現開關的其他行爲,即根據以前的狀態顯示off/on位置,並能夠正確地將其狀態正確地傳達給其他對象?

回答

5

將按鈕的類型設置爲On/Off。繼承它的單元格。 寫這兩個方法:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if ([self state]) 
    { 
     [onStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
    else 
    { 
     [offStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 
    } 
} 
- (void)highlight:(BOOL)flag withFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    if (flag){ 
     [downStateImage drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0]; 

    } 
} 
+0

就是這樣,謝謝。 – mss