6

我正在尝试NSPopUpButton像只有图像集的标准一样渲染NSButton,但没有任何运气。

很像 Mail.app 中的“+”按钮:

未点击 已点击

我想他们是用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:...]也无济于事。

有记录的方法可以做到这一点,还是归结为一些自定义子类?

4

5 回答 5

4

要防止按钮显示箭头:

[popupButton.cell setArrowPosition:NSPopUpNoArrow];
于 2013-11-12T11:04:02.673 回答
3

这是我用来最终在 Swift 中运行的代码(模仿 Apple 的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
}

确保按钮的宽度/高度足以容纳图像。我发现按钮右侧有一些填充覆盖了我的小图像,直到我使按钮足够宽以容纳神秘的填充。

于 2016-05-13T13:52:38.473 回答
2

在您的示例中,是的,它可能是用 实现的NSPopUpButton,但不是尝试自定义单元格,您真正想要的是-pullsDown:设置为 的按钮YES

这在 Interface Builder 中最容易设置。更简单的是,使用 BWToolkit,它具有专门用于此目的的按钮栏和自定义按钮。

于 2010-12-07T16:12:34.860 回答
1

@Laurent Etiemble(现已删除)的回答帮助了我和 OP。

看看这个线程和 Apple 的示例Menu Madness:它们包含一些示例代码,用于将图像放在 NSPopUpButton.

于 2016-11-08T11:39:01.667 回答
0

在 Xcode 4.4 中,您可以使用 Interface Builder 完成所有这些工作。

  1. 将标准拖到NSPopUpButton您的窗口,
  2. 选择样式作为您想要的任何类型的按钮,
  3. 选择按钮有图像但不设置图像,
  4. 在按钮顶部拖动NSImage您想要的任何图标。

我发现使用NSImage而不是设置按钮的图像效果更好。在弹出菜单中选择项目时,设置按钮图像会导致问题。

于 2012-09-19T02:02:28.340 回答