2010-12-07 48 views
6

我試圖讓NSPopUpButton呈現像標準NSButton只有一個圖像集,但沒有任何運氣。如何創建使用固定圖像且無箭頭的NSPopUpButton?

就像在Mail.app的 「+」 按鈕:

Not clicked Clicked

我認爲他們這樣做與NSPopUpButton。我試過最明顯的一點是:

NSMenuItem *imageItem = [[[NSMenuItem alloc] init] autorelease]; 
[imageItem setImage:[NSImage imageNamed:NSImageNameAddTemplate]]; 

[[popUpButton cell] setUsesItemFromMenu:NO]; 
[[popUpButton cell] setMenuItem:imageItem]; 
[[popUpButton cell] setImagePosition:NSImageOnly]; 

然而,這並不顯示圖像,而不是它只是顯示一對箭頭(我懷疑他們是繪製在該圖像會)。調用[popUpButton setImage:...]也什麼都不做。

是否有文件的方式來做到這一點,或者它歸結爲一些自定義的子類?

回答

2

在你的例子中,是的,它可能是用NSPopUpButton實現的,而不是試圖定製單元格,你真正需要的是一個-pullsDown:設置爲YES的按鈕。

這在Interface Builder中設置最簡單。更容易,使用BWToolkit,它具有一個按鈕欄和專門用於此目的的自定義按鈕。

+0

謝謝,你是對的,我確實需要`pullsDown`。然而,我實際上掙扎着的是讓我的圖像顯示而不顯示箭頭。菜單瘋狂樣本勞倫特提到了一些很好的例子,我需要實現的小竅門。我從構建這個Cocoa應用程序學習了很多東西(它已經變成了比我第一次想到的任務更大的任務)。 – d11wtq 2010-12-07 23:44:47

0

在Xcode中4.4,你可以通過使用界面生成器做了這一切。

  1. 拖累標準NSPopUpButton到你的窗口,
  2. 選擇風格爲你想要的任何類型的按鈕,
  3. 選擇按鈕,有一個形象,但不設置圖像,
  4. 阻力在按鈕上方您想要的任何圖標的NSImage

我發現使用NSImage而不是設置按鈕的圖像效果更好。在彈出菜單中選擇項目時,設置按鈕圖像會導致問題。

4

爲了防止按鈕從顯示的箭頭:

[popupButton.cell setArrowPosition:NSPopUpNoArrow]; 
1

這裏是我用來終於得到斯威夫特這個工作(蘋果公司的Menu Madness演示應用程序爲藍本)的代碼。

func setUpButton() { 
    let popupButton = NSPopUpButton() 
    popupButton.translatesAutoresizingMaskIntoConstraints = false 
    popupButton.pullsDown = true 
    popupButton.bordered = false 
    let popupCell = popupButton.cell as! NSPopUpButtonCell 
    popupCell.arrowPosition = NSPopUpArrowPosition.NoArrow 
    popupButton.addItemWithTitle("") 
    var item = popupButton.itemAtIndex(0) 
    item?.image = NSImage(named: "add") 
    item?.onStateImage = nil 
    item?.mixedStateImage = nil 
    popupButton.addItemWithTitle("Item1") 
    item = popupButton.itemAtIndex(1) 
    item?.action = #selector(item1Pressed) 
    item?.target = self 
    popupButton.addItemWithTitle("Item2") 
    item = popupButton.itemAtIndex(2) 
    item?.action = #selector(item2Tapped) 
    item?.target = self 
    self.addSubview(popupButton) 

    // NOTE: These are auto layout helper methods I made that you won't have. 
    // Just note that here is where I set up the auto layout constraints. 
    popupButton.widthConstraint(40) 
    popupButton.heightConstraint(20) 
    popupButton.centerVerticallyInSuperview() 
    popupButton.trailingSpaceToSuperview(0) 
} 

// TO MAKE SURE ALL ITEMS ALWAYS VALID (WHAT I WANTED FOR MY USE CASE) 
override func validateMenuItem(menuItem: NSMenuItem) -> Bool { 
    return true 
} 

func item1Pressed() { 
    // do stuff 
} 

func item2Pressed() { 
    // do stuff 
} 

確保使按鈕的寬度/高度足夠大,以便圖像。我發現在按鈕右側有一些填充物覆蓋了我的小圖像,直到我將按鈕放寬到足以容納神祕的填充。

0

@Laurent埃蒂安布勒的(現已刪除)回答讓我和OP。

看看this thread和蘋果的樣品Menu Madness:它們包含了一些示例代碼,把圖像放在一個 NSPopUpButton