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 に答える
0

Xcode 4.4では、InterfaceBuilderを使用してこれらすべてを実行できます。

  1. NSPopUpButton標準をウィンドウにドラッグし、
  2. 必要なボタンのタイプとしてスタイルを選択します。
  3. 画像を表示するボタンを選択しましたが、画像を設定しないでください。
  4. NSImageボタンの上に好きなアイコンを ドラッグします。

NSImageボタンの画像を設定する代わりに使用する方がはるかに効果的であることがわかりました。ボタンの画像を設定すると、ポップアップメニューで項目を選択するときに問題が発生しました。

于 2012-09-19T02:02:28.340 に答える