2010-12-07 3 views
6

J'essaye d'obtenir NSPopUpButton pour rendre comme un NSButton standard avec seulement un ensemble d'image, mais n'ayant aucune chance.Comment puis-je créer un NSPopUpButton qui utilise une image fixe et aucune flèche?

Tout comme le bouton "+" dans Mail.app:

Not clicked Clicked

Je suppose qu'ils ont fait avec NSPopUpButton. La chose évidente que j'ai essayé est:

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

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

Cela ne montre pas l'image cependant, au lieu il montre juste une paire de flèches (je pense qu'ils sont attirés sur où l'image serait). Appeler [popUpButton setImage:...] ne fait rien non plus.

Existe-t-il une méthode documentée pour ce faire, ou est-ce que cela revient à un sous-classement personnalisé?

Répondre

2

Dans votre exemple, oui, il est probablement implémenté avec un NSPopUpButton, mais plutôt que d'essayer de personnaliser la cellule, ce que vous voulez vraiment, c'est un bouton avec -pullsDown: mis à YES.

Cette configuration est la plus facile à configurer dans Interface Builder. Encore plus facile, utilisez BWToolkit qui comporte une barre de boutons et des boutons personnalisés spécialement à cet effet.

+0

Merci, vous avez raison, je dois 'pullsDown'. Ce que je luttais en réalité, cependant, consistait à faire afficher mon image sans afficher les flèches. L'exemple de Menu Madness que Laurent mentionne a quelques bons exemples pour les petits trucs que je dois réaliser. J'apprends beaucoup de construction de cette application Cocoa (qui est devenue une tâche beaucoup plus grande que je ne le pensais). – d11wtq

0

Dans Xcode 4.4, vous pouvez faire tout cela en utilisant Interface Builder.

  1. Faites glisser le NSPopUpButton standard pour votre fenêtre,
  2. sélectionnez le style que quel que soit le type de bouton que vous voulez,
  3. a choisi le bouton pour avoir une image mais ne définissez pas l'image,
  4. glisser un NSImage de l'icône que vous voulez sur le bouton.

J'ai trouvé que l'utilisation du NSImage au lieu de régler l'image du bouton fonctionnait beaucoup mieux. La définition de l'image du bouton a causé des problèmes lors de la sélection d'éléments dans le menu contextuel.

4

Pour éviter que le bouton d'afficher la flèche:

[popupButton.cell setArrowPosition:NSPopUpNoArrow]; 
1

Voici le code je pour finalement obtenir ce travail à Swift (sur le modèle Menu Madness l'application de démonstration d'Apple).

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 
} 

Assurez-vous que la largeur/hauteur du bouton est suffisamment grande pour l'image. J'ai trouvé qu'il y avait un peu de rembourrage sur le côté droit du bouton qui couvrait ma petite image jusqu'à ce que je fasse le bouton assez large pour accueillir le rembourrage mystérieux.

0

La réponse de @Laurent Etiemble (maintenant supprimée) m'a aidé ainsi que l'OP.

Jetez un oeil à this thread et l'échantillon d'Apple Menu Madness: ils contiennent quelques exemples de code pour mettre une image sur un NSPopUpButton.

Questions connexes