2010-12-07 101 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